CakePHP で select タグを生成する際に generateList メソッドをよく使います。

ちなみに使い方は下記の通りです。
$this->Model->generateList($conditions, $order,$limit, $keyPath, $valuePath);
$coditions :検索条件
$order :ソートの指定
$limit :取り出す数
$keyPath :配列のキーにするフィールド
$valuePath :配列の値にするフィールド

この $keyPath と $valuePath の指定方法が曲者で
{n}.Model.field
のようにモデル名の前に「{n}.」をつけなくては正しくデータを取得できません。

この「{n}」というのがなんなのかが気になり調べてみました。
詳しくは下記リンク先を参照していただくと分かります。
{n} ? – Cake PHP | Google グループ

以下実際に CakePHP のコードを調べてみたことをまとめます。

  • generateList メソッドでは検索条件などによって findAll する
  • findAll したデータから Set::extract メソッドを使用して該当するフィールドデータのみ抜き出す
  • Set::extract メソッドは配列以外にもオブジェクトからも extract できるように設計されている
  • 配列の場合はモデル名の前に「{n}」があるかどうかで判定している

という感じのようです。

ちなみに Set クラスは /cake/libs/set.php で定義されていて、コメントを見ると配列用のライブラリクラスのようです。

また、generateList で $keyPath, $valuePath を指定しなかった場合は下記のようになるようです。

  • $keyPath には モデルで指定した $primaryKey を使用
  • $primaryKey の指定がなければ ‘id’ フィールドを使用
  • $valuePath には モデルで指定した $displayField を使用
  • $displayField の指定がなければ ‘title’ フィールドが存在すれば ‘title’ フィールドを使用
  • ‘title’ フィールドが存在しなければ ‘name’ フィールドを使用
  • ‘title’ フィールドも ‘name’ フィールドも存在しなければ ‘id’ フィールドを使用

フィールド名の付け方も重要ですね。

関連する投稿