CakePHP3:根据关联的
是否可以将结果集按关联项分组 我有以下联想 AGTHESTABLECakePHP3:根据关联的,cakephp,query-builder,cakephp-3.x,Cakephp,Query Builder,Cakephp 3.x,是否可以将结果集按关联项分组 我有以下联想 AGTHESTABLE $this->belongsTo('Sites'); $this->hasMany('Agthemelanguages'); $this->belongsTo('Languages'); AgthemeLanguagesTable $this->belongsTo('Sites'); $this->hasMany('Agthemelanguages'); $this->belongsTo
$this->belongsTo('Sites');
$this->hasMany('Agthemelanguages');
$this->belongsTo('Languages');
AgthemeLanguagesTable
$this->belongsTo('Sites');
$this->hasMany('Agthemelanguages');
$this->belongsTo('Languages');
由于我想为每种Agthemelanguages
获取所有Agthemelanguages
,我编写了以下查询:
$agThemes = $this->Agthemes->find('all')
->select(['id', 'name', 'approved', 'published'])
->contain ([
'Sites' => function ($q) {
return $q->select(['id'])
->autoFields(false);
},
'Agthemelanguages.Languages' => function ($q) use ($localized_name) {
return $q->select(
[
'id',
'code',
'code3',
$localized_name
]
);
}
]
)
->where([
'approved' => true,
'published' => true
])
->matching(
'Sites', function ($q) use($site_id) {
return $q->where([
'Sites.id' => $site_id
]);
}
)
->group('language_id')
->all();
但我得到了一个错误:
Error: SQLSTATE[42S22]: Column not found: 1054 Unknown column 'language_id' in 'group statement'
实际上,在生成的sql查询中没有AgthemeLanguages
:
SELECT Agthemes.id AS `Agthemes__id`, Agthemes.name AS `Agthemes__name`, Agthemes.approved AS `Agthemes__approved`, Agthemes.published AS `Agthemes__published` FROM agthemes Agthemes INNER JOIN sites Sites ON (Sites.id = :c0 AND Sites.id = (Agthemes.site_id)) WHERE (approved = :c1 AND published = :c2) GROUP BY language_id
如果没有group
语句,我会得到这样的结果:
'items' => [
(int) 0 => object(App\Model\Entity\Agtheme) {
'id' => (int) 40,
'name' => '...',
'approved' => (int) 1,
'published' => (int) 1,
'agthemelanguages' => [
(int) 0 => object(App\Model\Entity\Agthemelanguage) {
'id' => (int) 372,
'agtheme_id' => (int) 40,
'language_id' => (int) 1,
'name' => '....',
'comment' => '....',
'language' => object(App\Model\Entity\Language) {
'id' => (int) 1,
...
},
...,
],
...,
},
...
]
如何定义这样的查询?
艾尔
编辑
通过这样编写查询,我终于得到了预期的结果,但它需要先进行另一次查询,以了解所有可用的Agthemes
,并将其ID放入$agThemeIds
数组中:
$agThemeLanguages = $this->Languages->find('all')
->select(
[
'id',
'code',
'code3',
$localized_name
]
)
->contain ([
'Agthemelanguages' => function ($q) use ($agThemeIds) {
return $q->where(['agtheme_id IN ' => $agThemeIds]);
}
]
)
->matching('Agthemelanguages', function ($q) use ($agThemeIds) {
return $q->where(['agtheme_id IN ' => $agThemeIds]);
})
->group(['Languages.id'])
->all();
你为什么不从另一边查询呢?旁注:你真的需要更容易地格式化你的代码。。。我已经觉得很紧张了。@ndm,好的,谢谢,是的,第二种方法对我来说很好,我只是想知道是否有可能对关联的事实进行分组/排序。。从php方面来说,当然可以。您可以使用分组/订购。