【问题标题】:How do I create a keyValue pair (display field) by combining/having two fields in CakePHP 3?如何通过在 CakePHP 3 中组合/拥有两个字段来创建 keyValue 对(显示字段)?
【发布时间】:2016-01-05 02:43:27
【问题描述】:

我需要帮助使用 findget 或其他任何东西。我需要有关在 CakePHP 中执行此操作的最简单方法的帮助。

这是我的尝试:

  1. 在我的控制器中

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

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

    <option value="10">Fabian;Pankiers</option>
    

请参阅我需要不带分号 ";" 的结果。现在我可以使用 javascript 来删除分号,但那是多余的。在 CakePHP 3 中是否有一种简单的方法来实现这一点?

【问题讨论】:

    标签: cakephp find cakephp-3.0 key-value dropdown


    【解决方案1】:

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

    valueField 使用回调

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

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

    另见

    结果格式化程序

    使用将值拼接在一起的结果格式化程序,list finder 内部也是这样做的,与上面的示例基本相同,只是更复杂。

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

    结合虚拟属性

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

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

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

    function($row) {
        return $row['full_name'];
    }
    

    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]);
    

    另见

    覆盖列表查找器

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

    use Cake\ORM\Query;
    
    // ...
    
    public function findList(Query $query, array $options)
    {
        return $query
            ->find()
            ->select(['id', 'first_name', 'last_name'])
            // etc ...
            ;
    }
    

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

    另见

    【讨论】:

    • 谢谢@ndm,你太棒了!我使用了 Computed fields 方法(连接)并且效果很好!
    • 很好的解决方案。谢谢
    【解决方案2】:

    简单快速的解决方案,效果很好(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]);
    

    【讨论】:

    • 也将其添加到我的答案中,不知道为什么我最初忽略了它。
    猜你喜欢
    • 2019-07-14
    • 1970-01-01
    • 2016-10-30
    • 1970-01-01
    • 2018-08-26
    • 2015-11-30
    • 2018-04-12
    • 2019-11-12
    • 2019-01-03
    相关资源
    最近更新 更多