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()」
続きはこちら