cakephp3:包含与COUNT()关联的深度模型

cakephp3:包含与COUNT()关联的深度模型,cakephp,orm,cakephp-3.0,Cakephp,Orm,Cakephp 3.0,我有以下相关的表对象: 设置稳定属于设置稳定 SettingsHeadersTable有许多SettingsTable SettingsOptionsTable属于stoSettingsTable SettingsTable有许多SettingsOptionsTable 例如: 标题为“常规站点设置” 该标题下有一个标题为“脱机状态”的设置 该设置下有3个选项,分别为“在线”、“离线” (限制)“开启”脱机(非限制) 我有一个控制器,我想找到所有的标题,包含这些标题下的所有设置,并进一步包含

我有以下相关的表对象:

设置稳定
属于
设置稳定

SettingsHeadersTable
有许多
SettingsTable

SettingsOptionsTable
属于sto
SettingsTable

SettingsTable
有许多
SettingsOptionsTable

例如:

  • 标题为“常规站点设置”
  • 该标题下有一个标题为“脱机状态”的设置
  • 该设置下有3个选项,分别为“在线”、“离线” (限制)“开启”脱机(非限制)
我有一个控制器,我想找到所有的标题,包含这些标题下的所有设置,并进一步包含这些设置下的所有选项。然后在我的视图中,我可以循环浏览每个设置,按标题划分为多个部分,并显示每个设置的相应选项,供管理员更新

下面,我的原始查询准确地显示了上面描述的内容,但是,它显示的是标题,即使它们有0个可见设置。我想隐藏具有0个可见设置的标题

    $settings_headers = $this->Settings->SettingsHeaders->find()
    ->order([
        'SettingsHeaders.number' => 'ASC'
    ])
    ->where([
        'SettingsHeaders.module_id' => 1
    ])
    ->contain([
        'Settings' => function ($q) {
           return $q
                ->order(['Settings.number' => 'ASC'])
                ->where([
                    'Settings.hide' => 0
                ])
                ->contain([
                    'SettingsOptions' => function ($q) {
                       return $q
                             ->order(['SettingsOptions.number' => 'ASC']);
                    }
                ]);
        }
    ])

    ->toArray();
我做了一些调整,只在标题中显示了可见的设置以及相应的设置,但是选项没有显示。我对包含和匹配仍然很困惑。我不确定我写的代码是否是多余的,我一直在尝试遵循我在网上看到的例子

    $settings_headers = $this->Settings->SettingsHeaders->find()
    ->order([
        'SettingsHeaders.number' => 'ASC'
    ])
    ->where([
        'SettingsHeaders.module_id' => 1
    ])
    ->select([
        'SettingsHeaders.id',
        'SettingsHeaders.title',
        'SettingsHeaders.number',
        'SettingsHeaders.module_id',
        'settings_count' => 'COUNT(Settings.id)',                               
    ])
    ->select($this->Settings)
    ->group('SettingsHeaders.id')
    ->contain([
        'Settings' => function ($q) {
           return $q
                ->order(['Settings.number' => 'ASC'])
                ->where([
                    'Settings.hide' => 0 // ONLY SHOW VISIBLE SETTINGS
                ])
                ->contain([
                    'SettingsOptions' => function ($q) {
                       return $q
                             ->order(['SettingsOptions.number' => 'ASC']);
                    }
                ]);
        }
    ])
    ->matching('Settings', function($q) {
        return $q->where([
            'Settings.hide' => 0 // ONLY COUNT THE VISIBLE SETTINGS
        ]);
    })
    ->toArray();

我不太清楚如何把它们放在一起(只显示带有可见选项的标题,还包含设置和设置选项中的所有数据)

事实上,我刚刚解决了这个问题。我必须从第二个示例中删除以下行:

->select($this->Settings)