我在Cakephp中遇到了很多这样的困境,而且我确定这是因为我没有遵循/理解某个地方的约定。在任何类型的belongsTo
(hasAnd或其他)中,我通常会发现,由于id
往往是外键,它最终也会显示在下拉菜单中,这当然是语义上的无用的。
这是我一般所做的一个例子;我希望有人可以直截了当地说:(我只是编写这些表格,因为它们是一般问题的好模板。)
假设:
Users
表包含id
| firstname
| lastname
Accounts
有id
| user_id
(我没做的就是这么简单,但这是问题的一般形式)
使用cake bake all
,我的Accounts/add
视图会为user_id
构建一个字面上显示ID号的下拉列表。我已经找到了几种方法,但它们都涉及基本上自己组装信息。我是通过在控制器中为$options
下拉user_id
下拉列出Accounts/add
数组来完成的,如下所示:
的控制器 的
$users = $this->Account->User->find('list');
$options = Set::combine($users, '{n}.User.id', array('{0} {1}', '{n}.User.firstname', '{n}.User.lastname'));
查看 的
echo $this->Form->input('user_id', array(
'div' => array( 'id' =>'UserId'),
'options'=>$options,'type'=>'select'
) )."\n\n";
或者通过:
的控制器 的
$users = $this->Account->User->find('all', array('recursive' => 1) );
然后以几乎相同的方式在View中解析数据。在任何一种情况下,我总是有一种挥之不去的确定性,即我可以用这样的方式来构建我的模型 - 这似乎太基本了,需要没有被这样一个广泛的框架解决。
答案 0 :(得分:3)
对于单列表,一个简单的$ displayField ='column_name'就是答案。
但是对于列的连接,还需要更多的代码:
public $virtualFields = array("full_name"=>"CONCAT(first_name, ' ' ,last_name)");
public $displayField = 'full_name';
如果它是一个非常复杂的$ displayField,可能需要一个afterFind解决方案,但在大多数情况下,这是解决方案。
希望有所帮助。