嗨,我希望能够生成一个使用查找列表,以便我可以在选择助手使用。但有个问题我想太fetch id,名称(第一个+最后一个).那么我如何才能实现它。我希望first_name和last_name连接为name。我怎样才能实现它。
$this->User->find('all',array('fields' => array('first_name','last_name','id')));
我不能使用模型过滤器和回调请建议我如何在控制器本身中做到这一点。
f5emj3cl1#
我认为这可以通过使用模型中的virtualFields和displayField属性来实现。在您的模型中,为全名定义一个虚拟字段,如下所示:
virtualFields
displayField
public $virtualFields = array( 'full_name' => 'CONCAT(User.first_name, " ", User.last_name)' );
如果你现在将displayField设置为full_name,你应该可以使用$this->User->find('list')方法获取你的用户列表,你可以使用表单帮助器而不会出现问题。
$this->User->find('list')
public $displayField = 'full_name';
.或:
public $displayField = 'User.full_name';
自动获取ID。
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
jc3wubiy3#
要实现这一点,首先转到模型并添加这一行
public $virtualFields = array('full_name' => 'CONCAT(first_name, " ", last_name)');
然后转到控制器文件,只需使用虚拟字段中的名称“full_name”
$this->User->find('all',array('fields' => array('full_name','id')));
它返回带有组合字段的name
guykilcj4#
但是,如果您需要一个替代方案,Teknoid很久以前就写了一篇关于这个问题的好文章:http://nuts-and-bolts-of-cakephp.com/2008/09/04/findlist-with-three-or-combined-fields/
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);
cx6n0qe36#
// 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希望有帮助。
6条答案
按热度按时间f5emj3cl1#
我认为这可以通过使用模型中的
virtualFields
和displayField
属性来实现。在您的模型中,为全名定义一个虚拟字段,如下所示:
如果你现在将displayField设置为full_name,你应该可以使用
$this->User->find('list')
方法获取你的用户列表,你可以使用表单帮助器而不会出现问题。.或:
自动获取ID。
uplii1fm2#
另一个解决方案是使用Cake的Set::合并来构建你需要的东西。
结果如下所示:
以下是文档链接:
http://book.cakephp.org/2.0/en/core-utility-libraries/set.html#Set::combine
jc3wubiy3#
要实现这一点,首先转到模型并添加这一行
然后转到控制器文件,只需使用虚拟字段中的名称“full_name”
它返回带有组合字段的name
guykilcj4#
但是,如果您需要一个替代方案,Teknoid很久以前就写了一篇关于这个问题的好文章:
http://nuts-and-bolts-of-cakephp.com/2008/09/04/findlist-with-three-or-combined-fields/
pxy2qtax5#
在我的例子中,Set::合并是正确的选择,因为我必须处理关联模型中字段的连接,比如:
返回
而
如果我不先删除虚拟字段,则在下面的查询中返回SQL错误:
cx6n0qe36#
CakePHP 4x更新。
阅读更多:https://book.cakephp.org/4/en/orm/retrieving-data-and-resultsets.html#customize-key-value-output
希望有帮助。