2016-01-15 55 views
0

我想用表中的同一組計數記錄。我知道這是可以輕鬆實現的查詢和是的,我已經做到了,但我正在考慮將主要模型和搜索模型的計數的正確方法。添加顯示同一組gridview下的記錄數的列yii2

數據庫看起來是這樣的:

Device 
---------------------------- 
id name   group_id 
1 Phone Sony  2 
2 Computer   1 
3 Printer   1 
4 Phone LG   1 


Group 
---------------------------- 
id name   
1 Home 
2 Office 

輸出表:

Group Name Device Count 
    Home   1 
    Office   3 

我已經做控制器上的查詢做到了這一點。

SELECT COUNT(*) 
FROM `hosts` 
WHERE group_id = *~DESIRED NUMBER HERE~* 

我在尋找更好的方法。我是SQL新手,我認爲joining tables是正確的方法,但我仍然不確定。

GroupSearch模型,我會補充一點:

$dataProvider->setSort(['attributes' => [ 
      'devicecount' => [ 
       'asc' => [ 'devicecount' => SORT_ASC ], 
       'desc' => [ 'devicecount' => SORT_DESC ], 
      ], 
     ] 
]); 

由於devicecount不可用表中它會顯示一個錯誤。我應該在哪裏計算相同的store_id?在Device型號或Group型號下?我怎樣才能把它們分類?

回答

0

official guide中有一個處理這種情況的例子。模型的

例子:

class Group extends \yii\db\ActiveRecord 
{ 
    public $devicesCount; 

    // ... 

    public function getDevices() 
    { 
     return $this->hasMany(Device::className(), ['group_id' => 'id']); 
    } 
} 

查詢的例子:

$customers = Group::find() 
    ->select([ 
     '{{group}}.*', // select all customer fields 
     'COUNT({{device}}.id) AS ordersCount' // calculate orders count 
    ]) 
    ->joinWith('devices') // ensure table junction 
    ->groupBy('{{group}}.id') // group the result to ensure aggregation function works 
    ->all(); 

其中{{group}}{{device}} - 團體和設備表名因此,也可以使用Group::tableName()Device::tableName()更好的代碼維護。

然後,因爲您將計數添加爲模型屬性,您將能夠按此列對結果進行排序。

+0

謝謝!我很抱歉,但我很難理解你的答案。你的桌子是什麼樣的?你在哪裏放置了你的查詢? – Gibs

+0

如何添加' - > where(* some condition *)'? – Gibs

+0

@Gibs這個例子取自文檔。根據你的情況糾正它。你可以在' - > all()'調用之前將它添加爲' - >和Where()'。 – arogachev

相關問題