たなちの開発日誌

自分の知識をストックしていくためのブログ

【cakePHP】データ抽出 findとgetの違いは何?

find,getのデータ取得方法についてのメモ。

http://book.cakephp.org/3.0/ja/orm/retrieving-data-and-resultsets.html

 より役に立ちそうな部分をまとめる。

get():主キーで単一のエンティティを取得する。

Cake\ORM\Table::get($id, $options =[])

// コントローラやテーブルのメソッド内で

// 単一の article を取得する
$article = $articles->get($id);

// 単一の article と、それに関連する comment を取得する。
$article = $articles->get($id, [
    'contain' => ['Comments']
]);

文字通りエンティティを取得する。

find():エンティティをロードする。

Cake\ORM\Table::find($type, $options =[])

find() メソッドの戻り値は常に Cake\ORM\Queryオブジェクト。

クエリを生成するだけ。クエリオブジェクトが実行されるのは、all()メソッドの呼び出しがされるとき、行フェッチまたは配列への変換がされるとき。

// コントローラやテーブルのメソッド内で
// すべての article を検索
// この時点ではクエリは走らない。
$query = $articles->find('all');

// イテレーションはクエリを実行する
foreach ($query as $row) {
}

// all() の呼び出しはクエリを実行し、結果セットを返す
$results = $query->all();

// 結果セットがあれば すべての行を取得できる
$data = $results->toArray();

// クエリから配列への変換はクエリを実行する
$results = $query->toArray();

クエリを生成するのにオプションを指定することができる。

 

最近リストボックスを生成する方法がわからなかったので調査。

連想配列を生成する必要があり、それにはfind('list');を使う。

list を呼び出す際、「keyField」 と「valueField」オプションを使うことで

「キー」、「値に使われるフィールド」を設定できる。

// コントローラやテーブルのメソッド内で
$query = $articles->find('list', [
    'keyField' => 'slug',
    'valueField' => 'title'
]);
$data = $query->toArray();

// データは下記のようになっています
$data = [
    'first-post' => '最初の投稿',
    'second-article-i-wrote' => '私が書いた2つ目の記事',
];

下記の方法で複数のテーブルからロードすることもできる。

join でつながっている関連テーブルからリストのデータを生成する。

$query = $articles->find('list', [
    'keyField' => 'id',
    'valueField' => 'author.name'
])->contain(['Authors']);
// Articles から id と title を、 Users から全列を select する
$query = $articles->find()
    ->select(['id', 'title'])
    ->select($articlesTable->Users)
    ->contain(['Users']);

実際に書いてみたら、find()が定義されていないメソッドです。みたいなエラーがでた。

「Call to undefined method Cake\ORM\ResultSet::find()」

 続きはこちら

【cakePHP】データ抽出 その3 テーブルから取得したデータをプルダウンに表示 - たなちの開発日誌