Группы опций со связанными таблицами

Я использую группировку опций в форме в cakephp 3. Я использую эту находку:

$seasons = $this->Episodes->Seasons
            ->find('all')
            ->combine('id','season','show_id')
            ->toArray();

Результат почти то, что мне нужно:

[
    (int) 269 => [
        (int) 784 => (int) 1
    ],
    (int) 270 => [
        (int) 785 => (int) 1,
        (int) 786 => (int) 2,
        (int) 787 => (int) 3
    ]
]

Но вместо группировки по show_id я бы предпочел группировать по названию шоу, то есть получить доступ к таблице, связанной с полем show_id, и получить оттуда имя, в результате чего

[
    'some show' => [
        (int) 784 => (int) 1
    ],
    'another show' => [
        (int) 785 => (int) 1,
        (int) 786 => (int) 2,
        (int) 787 => (int) 3
    ]
]

Я старался:

$seasons = $this->Episodes->Seasons
            ->find('all')
            ->contain('Shows')
            ->combine('id','season','Shows.name')
            ->toArray();

но это не работает. (Shows.name кажется пустым, в результате чего группировка вообще отсутствует.) Как я могу добиться желаемого результата?


person fpet    schedule 17.03.2016    source источник


Ответы (1)


Отвечая на мой собственный вопрос: это можно сделать с помощью закрытия.

    $seasons = $this->Episodes->Seasons
            ->find('all')
            ->contain('Shows')
            ->combine('id','season',function($season) {return $season->show->name;})
            ->toArray();

дает желаемый результат.

person fpet    schedule 17.03.2016
comment
Использование обозначенных точками путей тоже работает, но это должно быть show.name, что отражает реальную структуру данных. Коллекции не знают о соглашениях ORM и прочем. - person ndm; 19.03.2016
comment
@ndm: Может быть, вам следует опубликовать это как ответ вместо комментария, чтобы я мог установить его как принятый ответ. Я немного не хочу принимать свой собственный ответ... - person fpet; 26.03.2016
comment
Нет ничего плохого в том, чтобы принять ваши собственные ответы, учитывая, что они на самом деле верны. Если вы добавите подсказку с точечной нотацией и, возможно, ссылка на документацию у людей должно быть все необходимое для решения подобных задач. - person ndm; 26.03.2016