Windowsで始めるCakePHP4

CakePHP4のメモ

13

253 views

概要

CakePHP4には、データベース操作を効率化するためのORM(Object Relational Mapping)が用意されています。しかし、SQLを直接書いた方が良いという意見も根強くあります。この記事では、ORMを使わずにSQLを直接書いた場合の問題点と、ORMを使った場合のメリットを比較し、具体的なサンプルコードを通じて、ORMがいかに無駄なコードを削減し、保守性を向上させるかを解説します。

SQLを直接書く場合の問題点

まず、SQLを直接書く場合の問題点について見ていきましょう。特に複数のテーブルに同じようなCRUD操作を行うケースでは、SQL文の重複が多くなり、無駄なコードが増える傾向があります。また、SQLを直接書くと変更に対する柔軟性が低くなり、メンテナンス性も悪化します。

以下では、簡単なCRUD操作を例に、SQLを直接書いた場合と、ORMを使った場合のコードを比較します。

サンプルテーブル構造

今回の例では、2つのテーブルを使用します。

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

CREATE TABLE comments (
    id INT AUTO_INCREMENT PRIMARY KEY,
    article_id INT,
    comment TEXT,
    created DATETIME,
    modified DATETIME
);

articlesテーブルは記事を、commentsテーブルは記事に対するコメントを管理します。

ケース1:レコードの作成(INSERT)

SQLを直接書いた場合

以下のコードでは、articlesテーブルとcommentsテーブルに対して新しいレコードを挿入しています。SQLを直接書くと、テーブルごとにINSERT文を個別に書く必要があり、重複コードが増えます。

// データベース接続を取得
$connection = ConnectionManager::get('default');

// articlesテーブルへのINSERT
$sql = "INSERT INTO articles (title, body, created, modified) VALUES (:title, :body, NOW(), NOW())";
$params = ['title' => '新しい記事', 'body' => 'この記事はサンプルです。'];
$connection->execute($sql, $params);

// commentsテーブルへのINSERT
$sql = "INSERT INTO comments (article_id, comment, created, modified) VALUES (:article_id, :comment, NOW(), NOW())";
$params = ['article_id' => 1, 'comment' => 'サンプルコメントです。'];
$connection->execute($sql, $params);

SQLを直接書いた場合、複数のテーブルにINSERTを行う場合は毎回SQL文を書き直さなければなりません。また、他のテーブルでも同様のINSERT操作が必要な場合、SQL文のコピーペーストが増え、保守性が低下します。

ORMを使用した場合

CakePHP4のORMを使うと、データの挿入がシンプルになります。テーブルごとにSQL文を書かなくても、ORMがINSERT処理を自動で管理してくれるため、コードが短くなり、可読性が向上します。

// ArticlesテーブルへのINSERT
$articlesTable = TableRegistry::getTableLocator()->get('Articles');
$article = $articlesTable->newEntity(['title' => '新しい記事', 'body' => 'この記事はサンプルです。']);
$articlesTable->save($article);

// CommentsテーブルへのINSERT
$commentsTable = TableRegistry::getTableLocator()->get('Comments');
$comment = $commentsTable->newEntity(['article_id' => $article->id, 'comment' => 'サンプルコメントです。']);
$commentsTable->save($comment);

メリット:テーブルごとに同じようなSQL文を繰り返し書く必要がなくなり、挿入したいデータの内容を指定するだけで済みます。データの変更やバリデーションの設定も、ORMの設定で統一できるため、保守性が向上します。

ケース2:レコードの取得(SELECT)

次に、articlesテーブルとcommentsテーブルからデータを取得するコードを比較します。

SQLを直接書いた場合

SQLを直接書いた場合、SELECT文も毎回手書きする必要があります。特に、複数のテーブルからデータを取得する際にはJOINを使ったSQL文が増え、複雑化します。

// 記事データの取得
$sql = "SELECT * FROM articles WHERE id = :id";
$params = ['id' => 1];
$article = $connection->execute($sql, $params)->fetch('assoc');

// コメントデータの取得
$sql = "SELECT * FROM comments WHERE article_id = :article_id";
$params = ['article_id' => $article['id']];
$comments = $connection->execute($sql, $params)->fetchAll('assoc');

ORMを使用した場合

ORMを使えば、データの取得も簡単です。CakePHPのfind()メソッドを使えば、SQL文を記述せずに必要なデータが取得できます。

// 記事データの取得
$article = $articlesTable->get(1, [
    'contain' => ['Comments'] // リレーションの設定によりコメントも同時に取得
]);

echo $article->title;
foreach ($article->comments as $comment) {
    echo $comment->comment;
}

メリット:複数のテーブルにまたがるデータを取得する場合でも、リレーション設定を活用することで簡潔なコードで実現できます。SQL文の繰り返しやJOIN句を書く手間が省け、可読性が高まります。

ケース3:レコードの更新と削除(UPDATE, DELETE)

更新や削除処理も同様に、SQLを直接書いた場合とORMを使った場合を比較します。

SQLを直接書いた場合

// 記事データの更新
$sql = "UPDATE articles SET title = :title, modified = NOW() WHERE id = :id";
$params = ['title' => '更新されたタイトル', 'id' => 1];
$connection->execute($sql, $params);

// コメントデータの削除
$sql = "DELETE FROM comments WHERE id = :id";
$params = ['id' => 1];
$connection->execute($sql, $params);

更新や削除処理では、対象テーブルや条件ごとにSQL文が増え、特に複数のテーブルで同じような操作を行うときに重複が多くなります。

ORMを使用した場合

// 記事データの更新
$article = $articlesTable->get(1);
$article->title = '更新されたタイトル';
$articlesTable->save($article);

// コメントデータの削除
$comment = $commentsTable->get(1);
$commentsTable->delete($comment);

メリット:ORMを使うことで、対象エンティティを取得して値を変更し、保存するだけでデータが更新されます。削除も同様にdelete()メソッドで簡潔に処理でき、重複が減ります。

ORMの利点まとめ

  1. コードの重複が減る
    似たようなSQL文をテーブルごとに書き直す必要がなくなり、効率的な開発が可能です。

  2. 保守性と可読性が向上する
    ORMを使用すれば、複数のテーブルに対して統一した操作が可能になり、保守性が向上します。また、コードがシンプルになり、他の開発者にも理解しやすくなります。

  3. SQLインジェクションのリスクが減少
    パラメータバインディングが自動で行われるため、SQLインジェクションなどのセキュリティリスクが軽減されます。

  4. リレーション管理が容易
    CakePHPのORMは、モデル間のリレーションを定義することで、自動的にJOINしてデータを取得できるため、複雑なSQLを書く必要がありません。


以上、SQLを直接書く場合とORMを使う場合の違いを比較し、ORMのメリットを強調しました。CakePHP4のORMを使うことで、無駄なコードが減り、シンプルでメンテナンスしやすいコードが実現できます。データベース操作が頻繁に発生するプロジェクトでは、ORMを使った効率的な開発を検討してみてください。分からないやつは分かるまでSQLでガンガン書いて、後で後悔してください。

Page 28 of 34.

前のページ 次のページ



[添付ファイル]

1.php_xdebug-3.0.4-8.0-vs16-x86_64.dll  


お問い合わせ

プロフィール

すぺぺぺ

自己紹介

本サイトの作成者。
プログラムは趣味と勉強を兼ねて、のんびり本サイトを作っています。
フレームワークはdjango。
ChatGPTで自動プログラム作成に取り組み中。

サイト/ブログ

https://www.osumoi-stdio.com/novel/

ツイッター

@darkimpact0626