使用相关模型中的字段作为CakePHP中的显示字段

使用相关模型中的字段作为CakePHP中的显示字段,cakephp,Cakephp,我有一个模型,不包含任何标题。所有有趣的信息都在相关模型中 我已经读过有关virtualfields的内容,您可以使用它组合如下字段: public $virtualFields = array("full_name"=>"CONCAT(event_id, ' ' ,begin)"); public $displayField = 'full_name'; 但这给了我一个简单的身份证和日期。我需要那个id作为另一个型号的名称。这听起来真像是一份工作。您的显示字段不应引用其他模型,因为它并

我有一个模型,不包含任何标题。所有有趣的信息都在相关模型中

我已经读过有关virtualfields的内容,您可以使用它组合如下字段:

public $virtualFields = array("full_name"=>"CONCAT(event_id, ' ' ,begin)");
public $displayField = 'full_name';

但这给了我一个简单的身份证和日期。我需要那个id作为另一个型号的名称。

这听起来真像是一份工作。您的显示字段不应引用其他模型,因为它并不总是保证加入。因此,如果某个地方的呼叫没有引入数据,它将抛出一个错误

相反,您可以使用
Set::combine()
创建一个包含任意内容的键值数组。虽然这不太“神奇”,但它会减少出错的可能性

对于UsersController示例,假设您有一个配置文件,希望用户使用自动填充的下拉列表(即使用FormHelper)选择一个用户,该下拉列表显示用户配置文件中的全名。我们将使用来引入配置文件数据

class AppModel extends Model {
  $actsAs = array(
    'Containable'
  );
}
然后在UsersController中:

function choose($id = null) {
  // regular view code here
  $users = $this->User->find('all', array(
    'contain' => array(
      'Profile'
    )
  ));
  // create a key-value that the FormHelper recognizes
  $users = Set::combine($users , '{n}.User.id', '{n}.Profile.full_name');
}
您会注意到,
full\u name
现在位于概要文件模型上,因为它使用该模型中的字段。combine方法创建一个类似

array(
  1 => 'skerit',
  2 => 'jeremy harris'
);
当您使用FormHelper创建下拉列表时,将自动使用它

echo $this->Form->input('user_id');

谢谢,这有助于我理解combine()。别忘了你需要在你的例子中添加containable。酷,很高兴它帮助了别人。我在示例中添加了containable,以使答案更加完整。