忍び歩く男 - SLYWALKER

大阪のこっそりPHPer

find('list')に少々ハマる

<?php
Model::generateList();
?>

は1.2betaから非推奨なわけで、

<?php
Model::find('list');
?>

でいいんですが、
{key} や {value} を指定したいとき、
たとえば↓

<?php
$results = $this->Category->generateList($criteria, null, null, "{n}.Category.id", "{n}.Category.hoge")
?>

ってみたいなやつは、どうするの?

(Model::generateList) Deprecated, use Model::find("list") or Model::find("all") and Set::combine()

ってメッセージにある。

ほ〜 Set::combine()ってやつを使うのか・・・
Model::find("all")って、Model::findAllでよくないか?

ってことで、以下のようにしてできた。

<?php
$results = $this->Category->findAll($criteria, a('Category.id', 'Category.hoge'));
if ($results) {
    $results = Set::combine($results, '{n}.Category.id', '{n}.Category.hoge');
}
?>

$results が空配列のとき、Set::combine でエラー出てしまいます。
なんか面倒くさい・・・か?

というか、

<?php
$params = array(
    'conditions' => $criteria,
    'fields' => array('Category.id', 'Category.hoge'),
);
$results = $this->Category->find('list', $params);
?>

上で、fieldsを指定してますが、Model::findの中で

<?php
case 'list' :
	if (empty($query['fields'])) {
		$query['fields'] = array("{$this->alias}.{$this->primaryKey}", "{$this->alias}.{$this->displayField}");
	}
	if (!isset($query['recursive']) || $query['recursive'] === null) {
		$query['recursive'] = -1;
	}
	$keyPath = "{n}.{$this->alias}.{$this->primaryKey}";
	$valuePath = "{n}.{$this->alias}.{$this->displayField}";
break;
?>

っと、強制的に primaryKey と displayField が入るので意味なしです。
気をつけましょう。小一時間ハマりました・・・