fra*_*lbo 1 select cakephp query-builder cakephp-3.x
我想执行以下查询,我只想从关联中读取必要的字段。
我在下面使用了点符号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();
Run Code Online (Sandbox Code Playgroud)
您必须单独配置包含,为其他包含选择字段将不起作用。
确切地说,除了相应的包含配置之外,您无法从任何其他地方选择包含的字段,唯一的例外是belongsTo/hasOne使用联接策略的关联,可以在调用select()直接“父”查询时选择它们的字段,因为这些关联将通过该查询中的联接来检索。
例如,如果Sites是一个关联,那么您可以通过调用belongsTo来选择它的字段。如果是 a ,但是a ,那么您可以使用调用 for来选择字段 for 。select()OrdersUsersbelongsToSiteshasManyselect()SitesUsers
话虽这么说,在您的情况下,您可以使用选项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'
]);
}
]
])
Run Code Online (Sandbox Code Playgroud)
或者,如果您实际上不需要查询生成器,请使用该fields选项
contain([
'Sites' => [
'fields' => [
'Sites.id',
'Sites.user_id'
],
'Users' => [
'fields' => [
'Users.id',
'Users.name',
'Users.owner_id',
'Users.firstname',
'Users.lastname'
]
]
]
])
Run Code Online (Sandbox Code Playgroud)
也可以看看
| 归档时间: |
|
| 查看次数: |
4098 次 |
| 最近记录: |