CakePHP 3. Контейнерный выбор

У меня есть отношение многие ко многим, где TrainingPrograms могут содержать много упражнений. Они связаны через связываемые ExercisesTrainingPrograms.

Я хочу выбрать определенные поля из моих упражнений:

$trainingPrograms = $this->TrainingPrograms->find()
            ->contain(['Exercises' => function ($q) {
                return $q
                    ->select(['id','name','description']);
            }
            ])
            ->select(['id','name','description'])
            ->where(['user_id' => $this->Auth->user('id')]);

Результат, который я получаю, выглядит так:

   "trainingPrograms": [
            {
                "id": 1,
                "name": "Monday Madness",
                "description": "hes",
                "exercises": [
                    {
                        "id": 2,
                        "name": "Barbell Bench Press",
                        "description": "Medium grip ",
                        "exercise_categories_id": 2,
                        "exercise_difficulties_id": 1,
                        "created": "2015-09-16T07:07:01+0000",
                        "modified": "2015-09-16T07:07:01+0000",
                        "_joinData": {
                            "exercise_id": 2,
                            "id": 28,
                            "training_program_id": 1,
                            "created": "2015-10-07T15:45:49+0000"
                        }
                    },
                    {
                        "id": 2,
                        "name": "Barbell Bench Press",
                        "description": "Medium grip ",
                        "exercise_categories_id": 2,
                        "exercise_difficulties_id": 1,
                        "created": "2015-09-16T07:07:01+0000",
                        "modified": "2015-09-16T07:07:01+0000",
                        "_joinData": {
                            "exercise_id": 2,
                            "id": 35,
                            "training_program_id": 1,
                            "created": "2015-10-07T19:58:12+0000"
                        }
                    }
                ]
            }]

Как видите, я получаю все поля таблицы упражнений, а не поля, которые я просил. Почему, что я делаю не так?

1 ответ

Решение

belongsToMany ассоциации позволяют Query::autoFields() если поля не были определены через fields вариант. Это необходимо как внешний ключ (exercise_id) добавляется в SELECT предложение, которое в противном случае не привело бы к выбору других полей (не уверен, в каком контексте это действительно требуется).

См. Источник> \Cake\ORM\Association\BelongsToMany::_buildQuery()

Обратные вызовы для содержащихся ассоциаций вызываются позже, так что вам придется отключить autoFields() чтобы иметь возможность ограничить выбранные поля с помощью построителя запросов.

->contain(['Exercises' => function ($q) {
    return $q
        ->select(['id','name','description'])
        ->autoFields(false);
}

Я не могу точно сказать, является ли это предполагаемым поведением. Возможно, вы захотите открыть вопрос на GitHub для разъяснений или обратиться в IRC.

Другие вопросы по тегам