2016-06-28 47 views
1

以下是我的純SQL查詢。從SQL在Yii框架中選擇總和分組到活動記錄2

SELECT SUM(money) AS total_money, user_id 
FROM User 
INNER JOIN Person 
     ON Person.user_id = User.user_id 
GROUP BY user_id 

如何將此純查詢轉換爲Yii框架2中的ActiveRecord?我可以解決INNER JOIN但不知道如何解決SUM包括GROUP BY與誼2 ActiveRecord的

+0

查看此鏈接 - http://www.yiiframework.com/doc-2.0/yii-db-activequery.html –

+0

該鏈接顯示如何對所有記錄求和。在我的情況下,我需要總結和分組。我不能使用:$ Model-> find() - > groupBy('column') - > sum('column');因爲groupBY不會有效果。 –

回答

2

SELECT部分:

use yii\db\Expression; 

... 

->select([new Expression('SUM(money) as total_money'), 'user_id']) 

GROUP BY部分:

->groupBy('user_id') 

有關select()groupBy()的文檔,請參見Query Builder部分。

yii\db\Expression用於防止引用。

此處不能使用sum()方法,因爲它是聚合方法並返回一個數字,而在您的情況下,您將其與其他列一起使用以返回一組記錄。

整個查詢將是這樣的:

$personTable = Person::tableName(); 
$userTable = User::tableName(); 

$users = User::find() 
    ->select([new Expression('SUM(money) as total_money'), 'user_id']) 
    ->innerJoin($personTable, "$personTable.user_id = $userTable.user_id") 
    ->groupBy('user_id') 
    ->all() 

一對夫婦更多的事情提:

  • 這是更好地使用tableName()方法來獲得實際的表名,而不是手工編寫它的。在這種情況下,如果您決定更改表名稱,則只需在一個位置進行更改。
  • 最好用relation替換連接部分。
+0

可以請你做整個鏈嗎?因爲我想 - > all() –

+0

@OConnor更新了更多信息的答案。 – arogachev

+0

這樣做更好:$ personTable = Person :: tableName();或在任何地方使用Person :: tableName()而不將值賦給變量? –

-1

一個簡單的方法是使用findBySql

$sql = "SELECT SUM(money) AS total_money, user_id 
     FROM User 
     INNER JOIN Person ON Person.user_id = User.user_id 
     GROUP BY user_id"; 

$model = User::findBySql($sql)->all(); 
+0

這對於無法使用查詢構建器構建的非常複雜的查詢很有用,但對於這種情況不適用 – arogachev

+0

建議我同意您的解決方案與yii2更加一致...如果已經有查詢..他可以使用..直接 – scaisEdge

+0

使用findBySql()有什麼缺點嗎? –