モデルの指定列からselectタグを作るのに便利な方法

1.1系ではModel::generateList()メソッドを使えば、モデルから指定した列のkeyとvalueがペアとなった配列が取得でき、selectタグを作るのに便利でした。


1.2系ではそのgenerateList()は非推奨メソッドとなり、
「1.2系ではgenerateList()の代わりにModel::find('list')を使う」
という情報は色々なところで見つかったのですが、keyとvalueに使われる列を自分で指定する方法が分からなかったので調べてみました。


今回分かったのは2通りのやり方です。(Beta 1.2.0.6311で確認)

方法1:displayFieldプロパティを設定して、Model::find('list')を呼ぶ方法

こちらの方法はkeyに使われる列はモデルの主キー(通常であれば'id')固定になります。

モデルのdisplayFieldプロパティでvalueにセットしたい列の指定ができます。

displayFieldプロパティに指定列をセットした後で、find('list')を呼べば配列のvalueには指定した列の値がセットされます。

<?php
    // Mailモデルのsubjectをvalueに設定する例
    $this->Mail->displayField = 'subject';
    $mails = $this->Mail->find('list');

    // ビューでselectタグを作るためにset
    $this->set('mails', $mails);
 ?>


ちなみにdisplayFieldをセットしない場合は、そのモデルが'title'もしくは'name'という名前の列を持っていればその列('title'を優先)を、もっていなければ主キー列がvalueにセットされます。

方法2:Set::Combineを使う方法

こちらの方法はkeyとvalueの両方が指定できます。

Model::find('all')で取得したモデルの一覧データをSet::Combine($data, $keyPath, $valuePath)メソッドに渡すことでkeyとvalueがペアとなった配列が取得できます。

<?php
    // Mailモデルのidをkeyに、subjectをvalueに設定する例
    $results = $this->Mail->find('all');
    $mails = Set::Combine($results, '{n}.Mail.id', '{n}.Mail.subject');
    
    // ビューでselectタグを作るためにset
    $this->set('mails', $mails);
 ?>


$keyPath、$valuePathの指定方法はCakePHP Model::generateList メソッドの {n} | Sun Limited Mt.が詳しいです。

1.1系の情報ですが、1.2系でも当てはまる部分が多々あり、今回参考にさせて頂きました。