cakephp查找列表

cakephp查找列表,cakephp,Cakephp,嗨,我想能够生成一个使用查找列表,以便我可以在选择助手使用。但有一个问题。我还需要获取id、名称(第一个+最后一个)。那么我怎样才能实现它呢。我希望名字和姓氏作为名字连接起来。我怎样才能做到这一点 $this->User->find('all',array('fields' => array('first_name','last_name','id'))); 我不能使用模型过滤器和回调。请建议我如何在控制器本身中使用它 我认为这可以通过使用模型中的virtualFields和

嗨,我想能够生成一个使用查找列表,以便我可以在选择助手使用。但有一个问题。我还需要获取id、名称(第一个+最后一个)。那么我怎样才能实现它呢。我希望名字和姓氏作为名字连接起来。我怎样才能做到这一点

$this->User->find('all',array('fields' => array('first_name','last_name','id')));

我不能使用模型过滤器和回调。请建议我如何在控制器本身中使用它

我认为这可以通过使用模型中的
virtualFields
displayField
属性来实现

在您的模型中,为全名定义一个虚拟字段,如下所示:

public $virtualFields = array(
    'full_name' => 'CONCAT(User.first_name, " ", User.last_name)'
);
如果现在将displayField设置为full_name,您应该能够使用
$this->User->find('list')
方法获得用户列表,您可以在表单帮助器中使用该方法而不会出现问题

public $displayField = 'full_name';
。。。或:

public $displayField = 'User.full_name';

id是自动获取的。

另一种解决方案是使用Cake的Set::combine来构建您需要的

$users = $this->User->find('all',array('fields' => array('first_name','last_name','id')));

$user_list = Set::combine($users, '{n}.User.id', array('{0} {1}', '{n}.User.first_name', '{n}.User.last_name'));
结果将类似于:

array(
 [2] => 'First Last',
 [5] => 'Bob Jones'
)
以下是文档链接:


+1关于Tim的答案,如果你需要其他选择,teknoid很久以前就写了一篇很好的文章:


要实现此目的,请首先转到模型并添加此行

  public $virtualFields = array('full_name' => 'CONCAT(first_name, " ", last_name)');
然后转到控制器文件,只需使用您在虚拟字段中输入的名称“full_name”

$this->User->find('all',array('fields' => array('full_name','id')));

它返回带有组合字段的名称

在我的例子中,Set::combine是一种方法,因为我必须处理关联模型中字段的串联,如:

$bancos_enteros = $this->Financiacion->Banco->find('all', array(
  'fields' => array('Empresa.codigo_contable','Empresa.nombre_corto', 'Banco.id'),
  'order' => array('Empresa.codigo_contable' => 'asc'),
  'recursive' => 1
));
$bancos = Set::combine(
   $bancos_enteros,
   '{n}.Banco.id',
    array(
       '{0} {1}',
       '{n}.Empresa.codigo_contable',
       '{n}.Empresa.nombre_corto'
     )
 );
返回

    array(
    (int) 14 => '57200002 Caixa',
    (int) 15 => '57200003 Sabadell',
    (int) 3 => '57200005 BBVA',
    (int) 16 => '57200006 Deutsche Bank',
    (int) 17 => '57200007 Popular',
    (int) 18 => '57200009 March',
    (int) 26 => '57200010 Bankinter',
    (int) 4 => '57200011 Santander'
)

如果不先删除虚拟字段,则在以下查询中返回SQL错误:

unset($this->Financiacion->Banco->Empresa->virtualFields);
unset($this->Financiacion->Banco->virtualFields);

下面所说的virtualFields是应该采用的方法。保持控制器的精简。VirtualFields不一定是解决方案。问题是,是否要全局更改返回数据的结构以容纳一个控制器/操作?如果不是,使用Set::combine可能是更好的解决方案。如果您需要全局全名,请添加虚拟字段。请注意,可以动态定义虚拟字段。与CakePHP 2.X相关:可以将
full\u name
分配给
$displayField
并执行
查找('list')
,但是,您的解决方案也提供相同的输出。链接已断开,答案没有引用文章中的任何内容。
unset($this->Financiacion->Banco->Empresa->virtualFields);
unset($this->Financiacion->Banco->virtualFields);