cakephp查找列表

jk9hmnmh  于 2023-06-23  发布在  PHP
关注(0)|答案(6)|浏览(143)

嗨,我希望能够生成一个使用查找列表,以便我可以在选择助手使用。但有个问题我想太fetch id,名称(第一个+最后一个).那么我如何才能实现它。我希望first_name和last_name连接为name。我怎样才能实现它。

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

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

f5emj3cl

f5emj3cl1#

我认为这可以通过使用模型中的virtualFieldsdisplayField属性来实现。
在您的模型中,为全名定义一个虚拟字段,如下所示:

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。

uplii1fm

uplii1fm2#

另一个解决方案是使用Cake的Set::合并来构建你需要的东西。

$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

jc3wubiy

jc3wubiy3#

要实现这一点,首先转到模型并添加这一行

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

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

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

它返回带有组合字段的name

guykilcj

guykilcj4#

但是,如果您需要一个替代方案,Teknoid很久以前就写了一篇关于这个问题的好文章:
http://nuts-and-bolts-of-cakephp.com/2008/09/04/findlist-with-three-or-combined-fields/

pxy2qtax

pxy2qtax5#

在我的例子中,Set::合并是正确的选择,因为我必须处理关联模型中字段的连接,比如:

$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);
cx6n0qe3

cx6n0qe36#

CakePHP 4x更新。

// Model/Entity/{entityName}.php
// "fname, lname, email" are my DB field names
protected function _getFullName()
{
    return $this->_fields['fname'] . ' ' . $this->_fields['lname'];
}

protected function _getLabelDropdown()
{
    return $this->_fields['fname'] . ' ' . $this->_fields['lname'] . ' (' . $this->_fields['email'] . ')';
}

...

// Model/Table/{tableName}.php
public function getUserList()
{
    return $this->find('list', [
        'keyField' => 'uuid',
        'valueField' => function ($user) {
            return $user->get('full_name'); // It's _getFullName()
            // or 
            // return $user->get('label_dropdown'); // It's _getLabelDropdown()
        }
    ])->where([
        'is_delete' => 0,
        'is_active' => 1,
    ]);
}

// Controller/{ControllerName}.php
public function add()
{
  ...

  $this->set('user_list', $this->Users->getUserList());

  ...
}

// View
<?= $this->Form->control('role_uuid', [
   'options' => $user_list,
   'class' => 'form-select',
   'id' => 'user_uuid',
   'label' => __('Choose User'),
   'default' => DEFAULT_USER
]); ?>

阅读更多:https://book.cakephp.org/4/en/orm/retrieving-data-and-resultsets.html#customize-key-value-output
希望有帮助。

相关问题