我昨天花了太多时间研究同样的事情。
我认为你可以做的是在你的小部件模型中设置一个虚拟显示字段,它会在 book.cakephp.com 的这个部分的限制虚拟字段限制部分中建议执行类似的操作:
$this->virtualFields['cool_display_name'] =
sprintf('CONCAT(%s.name, " - ", %s.model)', $this->Brands->alias, $this- >Components->alias);
但是:除非您的“查找”功能在进行查询时收集到足够的数据,否则这将不起作用。find('list'),这可能是您对下拉列表的要求,它的默认递归设置为 -1,因此它不会向下遍历来获取它。我最终覆盖了在我的情况下是您的 Widget 模型的 find(),例如:
public function find($type = 'first', $query = array()) {
$return = array();
switch ($type) {
case 'list': // having to deal with a virtual field, seems like the least-messy workaround right now.
$query['contain'] = 'User.full_name';
$results = parent::find('all', $query);
foreach($results as $k => $r) {
$return[$r[$this->alias]['id']] = $r['User']['full_name'];
}
break;
default:
$return = parent::find($type, $query);
break;
}
return $return;
}
我在那里所做的是手动构建元素列表框所期望的数组,就像:
array( 'id' => 'display text')
你还会在那里看到我使用了 cakephp 的包含功能,所以不是所有的数据都被返回,而只是我需要的为了提供所有的虚拟场数据。