読者です 読者をやめる 読者になる 読者になる

ユアマイスター株式会社エンジニアブログ

ユアマイスター株式会社のエンジニアが日々徒然。

CakePHPのDBアクセスについて

こんばんは!ユアマイスターエンジニアチームの高崎です。 今日は弊社で採用しているPHPフレームワークCakePHPのDBアクセス機能について書きたいと思います。

CakePHPではSQL文が持つデータ操作機能をクエリオブジェクトが持つメソッドを使うことによって抽象化しています。 それぞれのメソッドはオブジェクト自身を返すようにつくられており、行いたい処理に該当するメソッドを複数つなげて書くことができます。

データの取得

SQL文でいうSELECTの機能を実装したメソッドで、find()get()などがあります。

$record = $this->hoge->find();

$record = $this->hoge->get();

のように使います。

行数を指定したり、条件を追加する時はそのまま後ろにつなげて書くことができます。 直感的に書くことができ、見た目にもわかりやすくなっています。

// 行数指定
$record = $this->hoge->find()->limit(10);

// 検索条件指定
$record = $this->hoge->find()->where('id' => 2);

データの追加 / 更新

SQL文でいうInsertとUpdateの機能にあたります。 なぜこの二つの機能をまとめているかというと、CakePHPでは、この二つの機能を一つのメソッドで実現しているからです。

$this->hoge->save($resultSet);

このsave()というメソッドで新規追加と更新の両方を行うことができ、引数にレコードのプライマリキーが含まれていれば更新、含まれていなければ新規追加、という判定をしています。

一般的なwebアプリケーションでは、レコードの新規追加と編集を同じような画面で作成することが多いのですが、そのような場合に最終的にDBにデータを登録する部分の処理を統一できるので、コードをシンプルに書くことが出来ます。

データの削除

SQL文でいうところのDelete文にあたります。

CakePHPでも同様にdeleteと表記するのですが、

$result = $this->Articles->delete($entity);

CakePHPでは自動的に連結先の依存関係にあるデータまで同時に削除をする機能が実装されています。 このようにCakePHPではテーブル間の関係性もあらかじめ定義をしておくことで、個々の処理でいちいち指定をする手間を省いています。

テーブルの連結

SQL文のJOINにあたります。CakePHPではアソシエーションという名称で実装されています。 種類が多いので、ここで紹介するのは一部にとどめますが、あらかじめ個々のテーブルを抽象化したオブジェクトの同士の関係性として定義しておくことで、以降の個々の処理の中で指定をする手間を省いています。

// 1対多 自テーブルが相手テーブルへの外部キーをもつ
$this->belongsTo('hoge', ['foreignKey' => 'hogehoge_id'])

// 1対多 相手テーブルが自テーブルへの外部キーをもつ
$this->hasMany('hoge');

// 1対1 相手テーブルに自テーブルへの外部キーをもつ
$this->hasOne('hoge');

最後に

ここまで書いたように、CakePHPでは単純なデータの取り扱いだけでなく、複数のテーブルにまたがる処理までしっかりと抽象化してあるため、感覚的にはテーブルを触るというよりは、連携するオブジェクト同士を操作するという方がしっくりくるような気もします。

SQLを直接書いてデータを操作するのに慣れていると、はじめは違和感を感じると思いますが、いったん慣れてしまえば、とてもわかりやすく使いやすいと思います。

私もまだ使い始めて日も浅く、充分使いこなせているとは言えませんが、これから知識を深めて便利に使っていこうと思っています。