2015-11-03 71 views
0

我有以下相關的表對象: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所有數據)

回答

0

其實,我只是想通這一點。我必須從我的第二個示例中刪除以下行:

->select($this->Settings)