Как выбрать поля содержимого ассоциации?
Я хотел бы выполнить следующий запрос, где я хотел бы прочитать только необходимые поля из связанных.
Я использовал точечную запись в select()
ниже, чтобы лучше объяснить, что я хочу.
В основном select()
похоже беспокоит Users
только. Можно ли указать поля Sites
?
$orders = $this->Orders->find()
->contain([
'Sites.Users'=> function ($q) {
return $q
->select([
'Sites.id',
'Sites.user_id',
'Users.id',
'Users.name',
'Users.owner_id',
'Users.firstname',
'Users.lastname'
])
->autoFields(false);
},
])
->first();
1 ответ
Вы должны настроить содержимое индивидуально, выбор полей для других объектов не будет работать.
Если быть точным, вы не можете выбрать поля для содержимого в другом месте, кроме соответствующей конфигурации содержимого, за исключением belongsTo/hasOne
ассоциации, использующие стратегию объединения, поля для них можно выбрать в select()
вызов непосредственного "родительского" запроса, так как эти ассоциации будут получены через соединение в этом запросе.
Если например Sites
будет belongsTo
ассоциации, то вы можете выбрать поля для этого через select()
позвонить на Orders
, Если Users
будет belongsTo
, но Sites
hasMany
тогда вы могли бы использовать select()
звать Sites
выбрать поля для Users
,
Это, как говорится, в вашем случае вы либо используете queryBuilder
возможность определить обратные вызовы в структуре вложенного массива
contain([
'Sites' => [
'queryBuilder' => function ($q) {
return $q
->select([
'Sites.id',
'Sites.user_id'
]);
},
'Users' => function ($q) {
return $q
->select([
'Users.id',
'Users.name',
'Users.owner_id',
'Users.firstname',
'Users.lastname'
]);
}
]
])
или, если вам на самом деле не нужен построитель запросов, используйте fields
вариант
contain([
'Sites' => [
'fields' => [
'Sites.id',
'Sites.user_id'
],
'Users' => [
'fields' => [
'Users.id',
'Users.name',
'Users.owner_id',
'Users.firstname',
'Users.lastname'
]
]
]
])
Смотрите также