我想执行以下查询,我只想从关联中读取必要的字段
我在下面的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();
答案 0 :(得分:4)
您必须单独配置包含,选择其他包含的字段才能使用。
确切地说,您不能从相应的包含配置以外的任何地方选择包含的字段,唯一的例外是使用连接策略的belongsTo/hasOne
关联,可以在{{}}中选择它们的字段{1}}致电直接"父母"查询,因为将通过该查询中的连接检索这些关联。
如果例如select()
是Sites
关联,则可以通过belongsTo
上的select()
调用为其选择字段。如果Orders
为Users
,belongsTo
为Sites
,则您可以使用hasMany
select()
来Sites
调用Users
{1}}。
话虽如此,在您的情况下,您可以使用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'
]
]
]
])
另见