来自一对多关系字段的 Yii2 querybuilder 总和

Yii2 querybuilder sum from a one-many relation field

当我想从关系 table 字段中计算时,请帮助我了解求和函数的工作原理。

查询非常简单。我有 unitsOrdered table 和 unitsSent table。关系是 1-n。所以我想计算特定订单的所有已发送单位。在这个例子中顺序 id=2;

我的数据库里有数据。

已订购单位:

id
1
2

发送单位:

id | order_id | units
1  |     1    |   5
2  |     2    |   2

我的查询是:

query = OrderedUnits::find()
                ->select([
                    'ou.*',
                    'sum(us.units) as alreadySent'
                ])
                ->joinWith('unitsSent us')
                ->where(['ou.id' => 2])
                ->orderBy('ou.id desc')
                ->groupBy(['ou.id'])
                ->all();

结果应该很清楚了:

id 2 = 2 units

然而,我的查询 returns:

id 2 = 10 units.

据我所知我做的是 5 * 2 = 10;

我的查询有什么问题?

关系定义如下:

/**
 * @return \yii\db\ActiveQuery
 */
public function getUnitsSent()
{
    return $this->hasMany(UnitsSent::className(), ['order_id' => 'id'])
        ->from(['us' => UnitsSent::tableName()]);
}

实际查询:

 'SELECT `ou`.*, sum(us.sent_units) as alreadySent FROM `ordered_units` `ou`
 LEFT JOIN `units_sent` `us` ON `ou`.`id` = `us`.`order_id`
 WHERE  (`ou`.`id`= 2)
 GROUP BY `ou`.`id`
 ORDER BY `ou`.`id` DESC'

你应该这样使用哈希过滤器格式->where(['us.id' => 2])

为了得到结果 2,你需要 innerJoin(你的原始 sql 显示你有一个左连接)否则不匹配的行也会被连接

query = OrderedUnits::find()
            ->select([
                'ou.*',
                'sum(us.units) as alreadySent'
            ])
            ->innerJoinWith('unitsSent us')
            ->where(['us.id' => 2])
            ->orderBy('ou.id desc')
            ->groupBy(['ou.id'])
            ->all();

并尝试检查使用

执行的真实查询
echo $query->createCommand()->getRawSql();

并记住,从 5.7 开始,mysql 中不允许选择未聚合且未在 group by 中提及的列(无论如何都不是使用 group by 的正确方法SQL)