cakephp查找列表

时间:2010-09-24 09:34:01

标签: cakephp

您好我希望能够使用find生成列表,以便我可以在select helper中使用。但有一个问题。我想要获取id,名称(第一个+最后一个)。那我怎么能实现呢。我希望first_name和last_name作为名称加入。我怎样才能实现它。

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

我无法使用模型过滤器和回调请建议我如何在控制器本身中执行此操作。

5 个答案:

答案 0 :(得分:24)

我认为可以使用模型中的virtualFieldsdisplayField属性来完成此操作。

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

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

如果您现在将displayField设置为full_name,您应该能够使用$this->User->find('list')方法获取用户列表,您可以使用该方法而不会出现Form-helper问题。

public $displayField = 'full_name';

......或:

public $displayField = 'User.full_name';

自动提取ID。

答案 1 :(得分:16)

另一个解决方案是使用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'
)

这是文档链接:

http://book.cakephp.org/2.0/en/core-utility-libraries/set.html#Set::combine

答案 2 :(得分:1)

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

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

然后转到控制器文件,只需使用您在虚拟字段中放置的名称“full_name”

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

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

答案 3 :(得分:0)

然而,如果你需要一个替代方案,那么teknoid在很久以前写了一篇很好的文章:

http://nuts-and-bolts-of-cakephp.com/2008/09/04/findlist-with-three-or-combined-fields/

答案 4 :(得分:0)

就我而言,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'
)

虽然

$this->Financiacion->Banco->Empresa->virtualFields = array(
    'codigo_nombre' => 'CONCAT(Empresa.codigo_contable,Empresa.nombre_corto)'
);
$this->Financiacion->Banco->virtualFields['codigo_nombre'] =  $this->Financiacion->Banco->Empresa->virtualFields['codigo_nombre'];
$bancos = $this->Financiacion->Banco->find('list', array(
   'fields' => array('Banco.id','Banco.codigo_nombre'),
   'order' => array('Banco.codigo_nombre' => 'asc'),
   'recursive' => 1
    )   
);
如果我不首先删除虚拟字段,

会在以下查询中返回SQL错误:

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