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.