Windowsで始めるCakePHP4

CakePHP4のメモ

13

286 views

概要

CakePHP4のORM(Object Relational Mapping)は、データベースとのやりとりをオブジェクトを通して行うため、データベース操作をシンプルかつ直感的にしてくれます。この記事では、CakePHPのエンティティとクエリービルダーを活用して、基本的なCRUD(作成、読み込み、更新、削除)操作を実装する方法を紹介します。

ステップ1:ORMの基本構造

CakePHP4のORMは、以下の3つの基本構造を通じてデータベース操作を行います。

  1. エンティティ(Entity):データベースの行(レコード)に対応するオブジェクトで、データを格納し、操作するためのオブジェクトです。
  2. テーブル(Table):エンティティの集合を管理し、クエリビルダーを使ったデータベース操作を提供するモデルです。
  3. クエリビルダー(Query Builder):データの抽出や条件指定など、データベースへのクエリ作成を簡単に行える構文です。

ステップ2:テーブルとエンティティの作成

まずは、データベースにarticlesテーブルを作成し、それに対応するモデルとエンティティを用意します。

2.1 テーブルの作成

以下のSQLコマンドでarticlesテーブルを作成します。

CREATE TABLE articles (
    id INT AUTO_INCREMENT PRIMARY KEY,
    title VARCHAR(255) NOT NULL,
    body TEXT,
    created DATETIME,
    modified DATETIME
);

2.2 モデルとエンティティの生成

CakePHP4のbakeコマンドを使って、articlesテーブルに対応するモデルとエンティティを生成します。

bin/cake bake model Articles

これにより、以下のファイルが生成されます:
- src/Model/Table/ArticlesTable.php:テーブルクラス
- src/Model/Entity/Article.php:エンティティクラス

ステップ3:エンティティの使い方

エンティティは、データの検証や一部フィールドの変更操作に利用されます。ArticlesTableモデルから新しいエンティティを生成し、フィールドに値をセットしてからデータベースに保存する例を紹介します。

3.1 エンティティの生成と保存

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 '記事の保存に失敗しました。';
}

3.2 エンティティのフィールド制限(アクセサ)

エンティティクラスにアクセサ(getter)を追加すると、フィールドの表示内容をカスタマイズできます。例えば、タイトルの先頭に「記事: 」を追加する場合は、以下のようにgetTitle()メソッドを定義します。

namespace App\Model\Entity;

use Cake\ORM\Entity;

class Article extends Entity
{
    protected function _getTitle($title)
    {
        return '記事: ' . $title;
    }
}

ステップ4:クエリビルダーの使い方

クエリビルダーを使うことで、CakePHPのORMでSQLのようにデータの取得や絞り込みができます。find()メソッドを用いて、条件を指定したデータの検索やソート、ページネーションを簡単に行えます。

4.1 基本的なデータ取得

まず、ArticlesTableからすべての記事データを取得する例です。

$articles = $articlesTable->find('all');
foreach ($articles as $article) {
    echo $article->title . "\n";
}

4.2 条件付きでのデータ取得

where()メソッドを使って条件を指定し、特定の条件に一致するデータのみを取得します。例えば、タイトルが「CakePHPの使い方」に一致する記事を取得する場合:

$articles = $articlesTable->find('all')
    ->where(['title' => 'CakePHPの使い方']);

4.3 並び替えとページネーション

order()で並び替え、limit()でページネーションも簡単に設定できます。

$articles = $articlesTable->find()
    ->order(['created' => 'DESC'])
    ->limit(5);

4.4 特定のカラムだけ取得

select()を使用すると、指定したカラムのみを取得できます。例えば、タイトルと作成日だけを取得する場合:

$articles = $articlesTable->find()
    ->select(['title', 'created']);

4.5 COUNTやSUMなどの集計関数

クエリビルダーで、count(), sum(), max() などの集計関数を使うことも可能です。以下は記事の数をカウントする例です。

$totalArticles = $articlesTable->find()->count();
echo '記事の総数: ' . $totalArticles;

ステップ5:エンティティの更新と削除

エンティティのデータ更新や削除は、エンティティを取得してから変更や削除の処理を行います。

5.1 エンティティの更新

IDを指定してエンティティを取得し、更新するフィールドの値を変更して保存します。

$article = $articlesTable->get(1); // IDが1の記事を取得
$article->title = '更新されたタイトル';
$article->body = '内容も更新しました';

if ($articlesTable->save($article)) {
    echo '記事が更新されました!';
}

5.2 エンティティの削除

delete()メソッドでエンティティを削除できます。

$article = $articlesTable->get(1);
if ($articlesTable->delete($article)) {
    echo '記事が削除されました。';
}

ステップ6:バリデーションの追加

モデルでバリデーションを設定し、データの整合性を保ちます。たとえば、タイトルは必須、255文字以内であることを設定する例です。

public function validationDefault(Validator $validator): Validator
{
    $validator
        ->notEmptyString('title', 'タイトルは必須です')
        ->maxLength('title', 255, 'タイトルは255文字以内で入力してください');

    return $validator;
}

これで、保存前にバリデーションチェックが行われ、条件に合わない場合はエラーメッセージが表示されます。

ベストプラクティス

  1. 命名規則の遵守:CakePHPの命名規則に従うと、テーブル名やエンティティ名が自動で認識されるため、効率が向上します。
  2. リレーションの設定:モデル間のリレーション(関連付け)を設定し、データの一括取得や関連データの自動保存を活用しましょう。
  3. バリデーションの使用:バリデーションルールを定義し、データの整合性とアプリケーションの信頼性を高めます。

まとめ

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/

ツイッター

@darkimpact0626