1

我正在尝试从 CakePHP3 Table 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/en/orm/retrieving-data-and-resultsets.html#finding-key-value-pairs但除了列表之外看不到其他示例单维。

谢谢,

4

1 回答 1

5

我会说为此使用list查找器是错误的方法。虽然您可以让它返回您正在寻找的内容,但我认为这有点骇人听闻,因为您完全改变了列表查找器最初打算返回的内容。

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

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

也可以看看

于 2016-01-05T14:15:34.920 回答