CakePHP3:根据关联的

CakePHP3:根据关联的,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

是否可以将结果集按关联项分组

我有以下联想

AGTHESTABLE

$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方面来说,当然可以。您可以使用分组/订购。