CakePHP4のメモ
![]() |
13 |
286 views
CakePHP4のORM(Object Relational Mapping)は、データベースとのやりとりをオブジェクトを通して行うため、データベース操作をシンプルかつ直感的にしてくれます。この記事では、CakePHPのエンティティとクエリービルダーを活用して、基本的なCRUD(作成、読み込み、更新、削除)操作を実装する方法を紹介します。
CakePHP4のORMは、以下の3つの基本構造を通じてデータベース操作を行います。
まずは、データベースにarticles
テーブルを作成し、それに対応するモデルとエンティティを用意します。
以下のSQLコマンドでarticles
テーブルを作成します。
CREATE TABLE articles (
id INT AUTO_INCREMENT PRIMARY KEY,
title VARCHAR(255) NOT NULL,
body TEXT,
created DATETIME,
modified DATETIME
);
CakePHP4のbake
コマンドを使って、articles
テーブルに対応するモデルとエンティティを生成します。
bin/cake bake model Articles
これにより、以下のファイルが生成されます:
- src/Model/Table/ArticlesTable.php
:テーブルクラス
- src/Model/Entity/Article.php
:エンティティクラス
エンティティは、データの検証や一部フィールドの変更操作に利用されます。ArticlesTable
モデルから新しいエンティティを生成し、フィールドに値をセットしてからデータベースに保存する例を紹介します。
ArticlesTable
モデルのnewEmptyEntity()
メソッドで新しいエンティティを生成し、必要なデータを設定してから保存します。
use Cake\ORM\TableRegistry;
$articlesTable = TableRegistry::getTableLocator()->get('Articles');
// 新しいエンティティの作成
$article = $articlesTable->newEmptyEntity();
$article->title = 'CakePHPの使い方';
$article->body = 'この記事では、CakePHPのORMを紹介します。';
// エンティティを保存
if ($articlesTable->save($article)) {
echo '記事が保存されました!';
} else {
echo '記事の保存に失敗しました。';
}
エンティティクラスにアクセサ(getter)を追加すると、フィールドの表示内容をカスタマイズできます。例えば、タイトルの先頭に「記事: 」を追加する場合は、以下のようにgetTitle()
メソッドを定義します。
namespace App\Model\Entity;
use Cake\ORM\Entity;
class Article extends Entity
{
protected function _getTitle($title)
{
return '記事: ' . $title;
}
}
クエリビルダーを使うことで、CakePHPのORMでSQLのようにデータの取得や絞り込みができます。find()
メソッドを用いて、条件を指定したデータの検索やソート、ページネーションを簡単に行えます。
まず、ArticlesTable
からすべての記事データを取得する例です。
$articles = $articlesTable->find('all');
foreach ($articles as $article) {
echo $article->title . "\n";
}
where()
メソッドを使って条件を指定し、特定の条件に一致するデータのみを取得します。例えば、タイトルが「CakePHPの使い方」に一致する記事を取得する場合:
$articles = $articlesTable->find('all')
->where(['title' => 'CakePHPの使い方']);
order()
で並び替え、limit()
でページネーションも簡単に設定できます。
$articles = $articlesTable->find()
->order(['created' => 'DESC'])
->limit(5);
select()
を使用すると、指定したカラムのみを取得できます。例えば、タイトルと作成日だけを取得する場合:
$articles = $articlesTable->find()
->select(['title', 'created']);
クエリビルダーで、count()
, sum()
, max()
などの集計関数を使うことも可能です。以下は記事の数をカウントする例です。
$totalArticles = $articlesTable->find()->count();
echo '記事の総数: ' . $totalArticles;
エンティティのデータ更新や削除は、エンティティを取得してから変更や削除の処理を行います。
IDを指定してエンティティを取得し、更新するフィールドの値を変更して保存します。
$article = $articlesTable->get(1); // IDが1の記事を取得
$article->title = '更新されたタイトル';
$article->body = '内容も更新しました';
if ($articlesTable->save($article)) {
echo '記事が更新されました!';
}
delete()
メソッドでエンティティを削除できます。
$article = $articlesTable->get(1);
if ($articlesTable->delete($article)) {
echo '記事が削除されました。';
}
モデルでバリデーションを設定し、データの整合性を保ちます。たとえば、タイトルは必須、255文字以内であることを設定する例です。
public function validationDefault(Validator $validator): Validator
{
$validator
->notEmptyString('title', 'タイトルは必須です')
->maxLength('title', 255, 'タイトルは255文字以内で入力してください');
return $validator;
}
これで、保存前にバリデーションチェックが行われ、条件に合わない場合はエラーメッセージが表示されます。
CakePHP4のORMを使うことで、複雑なSQLを意識せずに、シンプルでわかりやすいコードでデータベース操作が可能になります。エンティティとクエリービルダーを活用して、効
率的にCRUD操作や検索、集計を実装し、保守性の高いコードを書くことを心がけましょう。
Page 27 of 34.
1.php_xdebug-3.0.4-8.0-vs16-x86_64.dll
すぺぺぺ
本サイトの作成者。
プログラムは趣味と勉強を兼ねて、のんびり本サイトを作っています。
フレームワークはdjango。
ChatGPTで自動プログラム作成に取り組み中。
https://www.osumoi-stdio.com/novel/