ID ORM в Cakephp3 как многомерный ключ

Я пытаюсь получить следующий результат от объекта ORM таблицы CakePHP3:

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, но не видит другого примера, кроме единственного списка размерный.

Спасибо,


person Knightsbridge    schedule 05.01.2016    source источник


Ответы (1)


Я бы сказал, что использование list Finder для этого просто неправильный подход. Хотя вы можете заставить его возвращать то, что ищете, я бы назвал это своего рода хакерским, поскольку вы полностью меняете то, что искатель списков изначально должен был возвращать.

Итак, откажитесь от искателя list, отключите гидратацию и используйте, например, метод collections 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();

Смотрите также

person ndm    schedule 05.01.2016
comment
Это большое спасибо, именно то, что я ищу. Жалко, что мне нужно сопоставить результаты, чтобы удалить идентификатор, поскольку я подозреваю, что это приведет к снижению производительности при возврате больших наборов результатов. Мне нужно будет поэкспериментировать либо с повторным предоставлением идентификатора в наборе результатов, либо с сопоставлением, чтобы удалить его с точки зрения производительности по сравнению с возвратом больших наборов данных. Назначение идентификатора дважды (как в качестве ключа, так и в качестве значения) - это нормально, но выглядит пустой тратой, но позволяет обеспечить согласованный доступ к данным, позволяя при необходимости легко получать доступ к записям напрямую из ключа массива. Спасибо еще раз. - person Knightsbridge; 05.01.2016