CakePHP тот же формат результата, что и find (‘list’) в Containable

Я ищу способ получить результаты запроса, который использует Containable поведение должно быть отформатировано так же, как find('list') результаты есть. Например.:

$this->ModelA->find('all', array(
'contain' => array(
'ModelB' => array(
'ModelC' => array(
// This does NOT work but I need ModelC's fields to be formatted as an associative array where IDs are keys and names are values
'fields' => array('id' => 'name')
)
)
)
));

НОТА: Установка рекурсии в 1 или 2 вместо использования Containable является не вариант, если нет доступного решения с Containable,

1

Решение

Я не уверен, что вы можете вернуть возвращенные содержащиеся данные в нужном вам формате, но вы можете изменить их после нахождения. То, как Cake на самом деле строит доход от find('list') использует Hash::combine(). Таким образом, вы можете изменить возвращенные данные, используя это, чтобы сделать список просмотра данных find('list') вернуть:-

$data = [
[
'id' => 1,
'name' => 'Foo'
],
[
'id' => 2,
'name' => 'Bar'
]
];
$results = Hash::combine($data, '{n}.id', '{n}.name');

Это вернется:

[
1 => 'Foo',
2 => 'Bar'
]

Не уверен, что именно ваш find('all') данные выглядят так, как будто вы не предоставили ассоциации, но, вероятно, вы можете сделать что-то вроде этого:

foreach ($data as &$row) {
$row['ModelB']['ModelC'] = Hash::combine(
$row['ModelB']['ModelC'],
'{n}.id',
'{n}.name'
);
}
1

Другие решения

$ This-> ModelA-> Behaviors-> нагрузки ( ‘Containable’);

$ this-> ModelA-> find (‘all’, array (
‘содержать’ => массив (‘ModelB’, ‘ModelC’ => массив (‘fields’ => array (‘id’, ‘name’))
)
)
);

Пожалуйста, убедитесь, что вы создали ассоциацию модели

0