Cakephp 2.3:如何不使用'id'作为$ belongsTo <select> options </select>的标签

时间:2013-04-18 16:20:00

标签: cakephp cakephp-2.0 cakephp-2.3

我在Cakephp中遇到了很多这样的困境,而且我确定这是因为我没有遵循/理解某个地方的约定。在任何类型的belongsTo(hasAnd或其他)中,我通常会发现,由于id往往是外键,它最终也会显示在下拉菜单中,这当然是语义上的无用的。

这是我一般所做的一个例子;我希望有人可以直截了当地说:(我只是编写这些表格,因为它们是一般问题的好模板。)

假设:

Users表包含id | firstname | lastname

Accountsid | 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中解析数据。在任何一种情况下,我总是有一种挥之不去的确定性,即我可以用这样的方式来构建我的模型 - 这似乎太基本了,需要没有被这样一个广泛的框架解决。

1 个答案:

答案 0 :(得分:3)

对于单列表,一个简单的$ displayField ='column_name'就是答案。

但是对于列的连接,还需要更多的代码:

public $virtualFields = array("full_name"=>"CONCAT(first_name, ' ' ,last_name)");
public $displayField = 'full_name';

如果它是一个非常复杂的$ displayField,可能需要一个afterFind解决方案,但在大多数情况下,这是解决方案。

希望有所帮助。