CakePHP 3 Порядок построения запросов по вложенным отношениям

Документация для функции заказа недостаточно хороша. Вот что у меня есть:

Таблица A ‹---- MiddleTableAB ----> Таблица B ‹--- MiddleTableBC ---> Таблица C

Итак, у меня есть таблица B, которая имеет отношения «многие ко многим» с таблицей A, а также отношения «многие ко многим» с таблицей C.

Мне нужен список элементов таблицы B. Их нужно сгруппировать по идентификатору таблицы A, а затем по идентификатору таблицы C.

Это то, что у меня есть внутри функции таблицы B:

    $query=$this->find();
    $query->contain([
        'MiddleTableAB.TableA'=> function ($q) {
                return $q->select(['id','name']);
            },
        'MiddleTableBC.TableC'=> [
            'strategy' => 'select',
            'queryBuilder' => function ($q) {
                    return $q->select(['id','name']);
            },
        ]
    ]);
    //$query->select(['id','description']);
    $query->group(['TableA.id','TableC.id']);
    $data = $query->all();

Но торт говорит, что нет TableA.id. Если я удалю групповой вызов, я получу все данные, которые мне нужны для создания необходимого результата. Как я могу заставить это работать?


person Alejandro    schedule 27.10.2015    source источник


Ответы (1)


Приношу извинения за то, что упустил из виду номер версии Cakephp (то есть 3) в вопросе. Пожалуйста, найдите мои правки следующим образом:

Для множественных объединений в Cakephp 3, пожалуйста, проверьте документы здесь

Проверьте этот пример кода:

$query = $countries->find()
        ->hydrate(false)
        ->join([
            'City' => [
                'table' => 'cities',
                'type' => 'LEFT',
                'conditions' => 'Country.id = City.country_id'
            ],
            'Address' => [
                'table' => 'addresses',
                'type' => 'LEFT',
                'conditions' => 'City.id = Address.city_id'
            ]
        ])
        ->order(['state' => 'DESC']);

В приведенном выше методе Hydratate сообщает ORM не пытаться создавать объекты (проверьте здесь). Если вы хотите, чтобы сущности были сгенерированы, попробуйте удалить эту часть.

person user3278897    schedule 27.10.2015
comment
Этот код действителен для cakephp 2, а не для cakephp 3. Также в этом примере не используется функция заказа. Не могли бы вы помочь мне в моей конкретной проблеме? благодарю вас - person Alejandro; 28.10.2015
comment
Прошу прощения за поиск номера версии. Я соответствующим образом изменил ответ, проверьте, соответствует ли он вашим потребностям (функция заказа - это просто еще одно вложение в поиск, я добавил его в ответ) - person user3278897; 28.10.2015