cakephp3でクエリを使ってテーブルのデータを取得する方法
cakephp3でクエリを使ってデータを取得するお作法は下記の通り
// すべての article を検索
// この時点ではクエリーは走らない。
$query = $articles->find('all');
// イテレーションはクエリーを実行する
foreach ($query as $row) {
}
// all() の呼び出しはクエリーを実行し、結果セットを返す
$results = $query->all();
// 結果セットがあれば すべての行を取得できる
$data = $results->toList();
// クエリーからキーと値の配列への変換はクエリーを実行する
$data = $query->toArray();
ただ、contain等を使って、情報を取得すると助長なオブジェクトまで取得したり、配列の構造上使いづらくなってしまうことが発生する。
そこで
$query->hydrate(false);
を使うと、素となる配列だけが取得できるので扱いやすくなる。
また、Hashなどを組み合わせると、
$a = [
[
'User' => [
'id' => 2,
'group_id' => 1,
'Data' => [
'user' => 'mariano.iglesias',
'name' => 'Mariano Iglesias'
]
]
],
[
'User' => [
'id' => 14,
'group_id' => 2,
'Data' => [
'user' => 'phpnut',
'name' => 'Larry E. Masters'
]
]
],
];
から
$result = Hash::combine($a, '{n}.User.id');
/* $result は以下のようになります:
[
[2] =>
[14] =>
]
*/
$result = Hash::combine($a, '{n}.User.id', '{n}.User.Data.user');
/* $result は以下のようになります:
[
[2] => 'mariano.iglesias'
[14] => 'phpnut'
]
*/
$result = Hash::combine($a, '{n}.User.id', '{n}.User.Data');
/* $result は以下のようになります:
[
[2] => [
[user] => mariano.iglesias
[name] => Mariano Iglesias
]
[14] => [
[user] => phpnut
[name] => Larry E. Masters
]
]
*/
$result = Hash::combine($a, '{n}.User.id', '{n}.User.Data.name');
/* $result は以下のようになります:
[
[2] => Mariano Iglesias
[14] => Larry E. Masters
]
*/
$result = Hash::combine($a, '{n}.User.id', '{n}.User.Data', '{n}.User.group_id');
/* $result は以下のようになります:
[
[1] => [
[2] => [
[user] => mariano.iglesias
[name] => Mariano Iglesias
]
]
[2] => [
[14] => [
[user] => phpnut
[name] => Larry E. Masters
]
]
]
*/
$result = Hash::combine($a, '{n}.User.id', '{n}.User.Data.name', '{n}.User.group_id');
/* $result は以下のようになります:
[
[1] => [
[2] => Mariano Iglesias
]
[2] => [
[14] => Larry E. Masters
]
]
*/
と使えるので、keyを元に配列操作をしやすくなる。