我有以下相關的表對象:CakePHP的3:含有深層關聯的模型與COUNT()
SettingsTable
屬於關聯SettingsHeadersTable
SettingsHeadersTable
的hasManySettingsTable
SettingsOptionsTable
屬於關聯SettingsTable
SettingsTable
的hasManySettingsOptionsTable
例如:
- 有一個標題爲 「常規網站設置」 的報頭。
- 該標題下有一個標題爲「離線狀態」的設置。
- 有下該設置爲「在線」 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();
我做了一些調整,並得到只有可見的設置,以顯示與他們相應的設置的標題,但沒有顯示選項。對於包含VS匹配,我仍然很困惑。我不確定我寫的代碼是否是多餘的,我一直試圖按照我在網上看到的例子。
$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();
我不太知道如何把它放在一起(只顯示可見的選項報頭,並且還包含在這兩種環境和SettingsOptions所有數據)