CakePHPでget・findの使い方とアソシエーションがある場合の使い方

CakePHPでget・findの使い方とアソシエーションがある場合の使い方

324 回閲覧されました

みなさんこんにちは、jonioです。

CakePHPでデータを取得するのにgetとfindがありますが使い方が曖昧になっているのでまとめました。

アソシエーションをした時の使い方の解説もします。

ざっくりとした違い

違いは以下になります。

  • get : 特定のレコード1件を取得
  • find : 複数のレコードを取得

それぞれ見ていきます。

get

コードの書き方は下記になります。

$this->モデル名->get(主キー);

主キーは通常はidになりますがアクションの引数を主キーの部分に使う場合は変数名が変わってきます。

例えば下記です。

public function view($company_id)
{
  $this->Users->get($company_id);
}

アソシエーションをする場合

usersテーブルとcompaniesテーブルをアソシエーションしているとします。

データの取得ですが下記の2通りを知っていればいいと思います。

  • 対象のテーブルのデータを取得
  • 対象のテーブルのデータとそれに関連するデータも取得

それぞれ見ていきます。

対象のテーブルのデータを取得

下記の書き方をしたとします。

$this->Companies->Users->get($id);

この書き方の意味はcompaniesテーブルに紐づくusersテーブルの中で$idに該当するusersテーブルのデータだけを取得します。

だから取得データはusersテーブルのデータになります。

対象のテーブルのデータとそれに関連するデータも取得

下記の書き方をしたとします。

$this->Users->get($id, ['contain' => ['Companies']]);

この書き方をするとusersテーブルの中で$idに該当するデータを取得して該当するデータに関連するcompaniesテーブルのデータも取得します。

だから該当するデータだけではなく該当データに関連するデータも取得できます。

取得したい関連するデータは「’contain’ => [‘Companies‘]」のCompaniesの部分に記述すればいいです。

今はCompaniesだけを記述していますが下記のように複数のモデルを記述してもいいです。

$this->Users->get($id, ['contain' => ['Companies', 'RoleTypes', 'AnotherModel']]);

特殊な使い方

下記の記述をしたとします。

$this->Companies->get($id, ['contain' => ['Departments', 'Users.RoleTypes']]);

containの項目がDepartmentsだけだと会社と会社に紐づく部署のデータを取得しますが項目がUsers.RoleTypesの場合は会社と会社に紐づくユーザーに紐づいている権限のデータを取得できます。

「モデル名.モデル名」と記述することで元々のデータ(Companies)に紐づいていないデータ(RoleTypes)も取得できます。

次はfindです。

find

コードの書き方は下記になります。

$this->モデル名->find('all');

allは省略可能です。

テーブルのすべてのデータを取得できます。

条件の絞り込み

下記の書き方をしたとします。

$this->Companies->Users->find('all', ['conditions' => ['id' => $company_id]]);

条件で絞り込む場合は「[‘conditions’ => [‘カラム名’ => 条件]]」をつけます、この絞り込みはUsersに適用されます。

カラム名はどのテーブルのカラムかを示すために「Users.id」と書いてもいいです。

条件を絞り込む時にconditionsを使うのではなくwhereを使ってもいいです、結果も同じになります。

書き方は下記になります。

$this->Companies->Users->find('all')->where(['id' => $company_id]);

以上です。