2016-06-28 76 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()有什么缺点吗? –