当前位置:  开发笔记 > 数据库 > 正文

Cakephp3 ORM ID作为密钥多维

如何解决《Cakephp3ORMID作为密钥多维》经验,为你挑选了1个好方法。

我正在尝试从CakePHP3表ORM对象获得以下输出:

array(
       [primarykey] => array (
                                 'name' => 'users name',
                                 'created_by' => 'created by data'
                             ) 
     )

我试过使用:

$users->find('list',    [
                            'keyField' => 'id',
                            'valueField' => ['name', 'created_by']
                        ])
            ->where(['is_active' => 1])
            ->toArray();

但是,这只是将name和created_by列连接为一个字符串,并用';'分隔。例:

[1] =>“用户名;由数据创建”

如何在不获取数据的情况下手动进行解析?

我看过http://book.cakephp.org/3.0/zh-CN/orm/retrieving-data-and-resultsets.html#finding-key-value-pairs,但除了列表以外,看不到其他示例一维。

谢谢,



1> ndm..:

我想说的是,使用list查找器是错误的方法。尽管您可以使它返回您要查找的内容,但我还是称其为hacky,因为您正在完全更改列表查找器最初打算返回的内容。

因此,抛开list查找器,禁用水合,并使用例如collections indexBy方法(查询对象是collections)

$users
    ->find()
    ->select(['id', 'name', 'created_by'])
    ->where(['is_active' => 1])
    ->hydrate(false)
    ->indexBy('id')
    ->toArray();

这将返回类似

[
    pk => [
        'pk' => pk,
        'name' => 'name',
        'created_by' => 'created_by'
    ]
    // ...
]

如果您不想在结果中包含主键字段,请使用映射器将其删除

$users
    ->find()
    ->select(['id', 'name', 'created_by'])
    ->where(['is_active' => 1])
    ->hydrate(false)
    ->indexBy('id')
    ->map(
        function ($row) {
            unset($row['id']);
            return $row;
        }
    )
    ->toArray();

也可以看看

食谱>数据库访问和ORM>查询生成器>查询是集合对象

食谱>收藏> Collection :: indexBy()

食谱>收藏> Collection :: map()

推荐阅读
凹凸曼00威威_694
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有