CakePHP3を触ってみました 〜あなたは何リスト?〜

この記事はだいぶ前に書かれたものなので情報が古いかもしれません
シンドラーのリスト

この記事を三行にまとめると

リストの取得方法がCakePHP3の場合だとちょいとだけ変則的な感じ
統一感のある書き方ができる方が分かりやすいと思うんですが……
俺はソリストかなぁ
CakePHPのfindにはいくつかの使い方があります。一件だけ取得する場合(first)、条件に該当するデータを全件取得する場合(all)、件数のみを取得する場合(count)、それから二つのカラムをリスト形式で取得する場合(list)。主なのはこの四つですかね。

このうちリストの取得方法がCakePHP3の場合だとちょいとだけ変則的な感じなんで、今日はそれを見てみまっしょい。

CakePHP2とCakePHP3のfindの基本的な使い方については以前にも書いたことがあるんで、良かったらそっちを見てみてくだせえ。

CakePHP3を触ってみました 〜キミは鎖につながれた生き方を選ぶか?〜



list以外

一応、リスト以外のもさらっと簡単に見ときますか。

例えば、postsというテーブルからブログ記事のデータを取って来る場合を考えてみましょう。

$posts = TableRegistry::get('Posts');//インスタンスの生成
$posts->find()->all();//全件取得
$posts->find()->first();//一件だけ取得
$posts->find()->count();//件数取得

こんな感じっすね。条件がある場合はwhere()やselect()をつなぎます。

$posts = TableRegistry::get('Posts');
$query = $posts->find();
$query->where(['year' => '2016']);
$query->select(['id', 'title']);
$results = $query->all();

ここでは2016年に書かれた記事のIDとタイトルを取得していると思ってください。



list

上記と同じ感覚で書くならlistも↓のようになると思うんですが、この書き方だとエラーになります。

$posts = TableRegistry::get('Posts');
$query = $posts->find();
$query->where(['year' => '2016']);//2016年に書かれた記事
$query->select(['id', 'title']);//IDとタイトルだけ取得
$results = $query->list();

listなんてメソッドはねーよって言われちゃいます。

じゃあどう書けば良いかってーと、こんな感じ。

$posts = TableRegistry::get('Posts');
$query = $posts->find('list', [
  'keyField' => 'id',//リスト配列のキー
  'valueField' => 'title',//リスト配列の値
]);
$query->where(['year' => '2016']);
$results = $query->toArray();

これでCakepHP2の時の「find(‘list’)」と同じ結果を取得できます。select()の代わりにfind()の第二引数でキーと値になるフィールドを指定する必要があるみたいですね。最後の「$query->toArray()」で、$resultsに取得したリストの配列を入れています。






どうしてlistだけこんな書き方が必要なんですかねー? せっかくconditionsやfieldsがwhereやselectに変わって分かりやすくなったんだから、リストもそういう書き方できた方が分かりやすい気もするんですが……まあ何かしらの意図があるのでしょう。

ともあれ、リストを取得したい時は「$users->find()->list()」みたいな書き方はできないってことだけ注意してくださいな。



その他のCakePHP3を触ってみましたの記事はこちら
まとめという名の箸休め
 もしかしたら何か関連しているかも? 
 みんなからのコメント 
2016年12月20日 10:20:10
通りすがり
list は php の予約語なので、メソッド名には使えないんです。
2016年12月20日 12:43:09
まっち~(管理人)
おお、なるほど! そういう理由でしたか。
完全に合点がいきました。ありがとうございます!