如何通过在CakePHP 3中组合/拥有两个字段来创建keyValue对(显示字段)?

Daw*_*jee 11 cakephp find key-value cakephp-3.0 dropdown

我需要帮助使用findget或其他任何东西在键值对中获取两个值(用于人类友好下拉列表).我需要帮助最简单的方法在CakePHP中执行此操作.

这是我的尝试:

  1. 在我的控制器中

      $users = $this->LocationsUser->Users->find('list', [
        'limit' => 1,
        'keyField' => 'id',
        'valueField' => ['first_name', 'last_name']
      ])->where(['id' => $id]);
    
    Run Code Online (Sandbox Code Playgroud)
  2. 在我看来

      echo $this->Form->input('user_id', [
            'options' => $users,
            'type' => 'select',
            'multiple' => false,
          ]);
    
    Run Code Online (Sandbox Code Playgroud)
  3. 我下拉列表的结果:

    <option value="10">Fabian;Pankiers</option>
    
    Run Code Online (Sandbox Code Playgroud)

看到我需要一个没有分号的结果";" .现在我可以使用javascript删除分号,但那就太过分了.在CakePHP 3中有没有一种简单的方法可以实现这一点?

ndm*_*ndm 25

有多种方法可以解决这个问题,其中有三种方法:

使用回调 valueField

使用回调并使用结果中的值将值拼接在一起.

$query = $this->LocationsUser->Users
    ->find('list', [
        'valueField' => function ($row) {
            return $row['first_name'] . ' ' . $row['last_name'];
        }
    ])
    ->where(['id' => $id]);
Run Code Online (Sandbox Code Playgroud)

也可以看看

结果格式化程序

使用将值组合在一起的结果格式化程序,这也就是list取景器在内部执行的操作,与上面的示例基本相同,只是更复杂.

$query = $this->LocationsUser->Users
    ->find()
    ->select(['id', 'first_name', 'last_name'])
    ->formatResults(function($results) {
        /* @var $results \Cake\Datasource\ResultSetInterface|\Cake\Collection\CollectionInterface */
        return $results->combine(
            'id',
            function($row) {
                return $row['first_name'] . ' ' . $row['last_name'];
            }
        );
    })
    ->where(['id' => $id]);
Run Code Online (Sandbox Code Playgroud)

结合虚拟属性

您还可以在此处使用(重新)使用虚拟属性,例如,full_name在您的User实体类中定义的属性名称:

protected function _getFullName()
{
    return $this->_properties['first_name'] . ' ' . $this->_properties['last_name'];
}
Run Code Online (Sandbox Code Playgroud)

您可以在格式化程序中返回它,而不是再次手动组合这两个字段:

function($row) {
    return $row['full_name'];
}
Run Code Online (Sandbox Code Playgroud)

valueField示例中也可以这样做.

也可以看看

计算字段

添加计算字段并将其用于该valueField选项

$query = $this->LocationsUser->Users
    ->find('list', [
        'keyField' => 'id',
        'valueField' => 'concatenated'
    ]);
$query
    ->select([
        'id',
        'concatenated' => $query->func()->concat([
            'first_name' => 'literal',
            ' ',
            'last_name' => 'literal'
        ])
    ])
    ->where(['id' => $id]);
Run Code Online (Sandbox Code Playgroud)

也可以看看

覆盖列表查找器

如果您希望始终应用自定义列表,则可以覆盖表类中的list查找程序Users.

use Cake\ORM\Query;

// ...

public function findList(Query $query, array $options)
{
    return $query
        ->find()
        ->select(['id', 'first_name', 'last_name'])
        // etc ...
        ;
}
Run Code Online (Sandbox Code Playgroud)

这样你就可以继续使用了find('list').

也可以看看


Mai*_*Pal 6

简单快速的解决方案,像魅力一样工作(CakePHP 3.2.6):

$users = $this->LocationsUser->Users->find('list', [
    'limit' => 1,
    'keyField' => 'id',
    'valueField' => function ($e) {
            return $e->get('first_name'). ' ' . $e->get('last_name');
        }
])->where(['id' => $id]);
Run Code Online (Sandbox Code Playgroud)