Yii2 activerecord意外结果带有()回调函数的限制

时间:2015-09-28 23:35:39

标签: sql activerecord yii2 yii2-model

我在使用Yii2构建查询时出现问题。

我们假设我们有四个相关模型:客户,订单,订购项目和订购图片。

订单与客户相关,订单与订单相关,订单图则与订单相关。

以下是代码:

Customers::find()
            ->where(['id' => $id])
            ->with(['orders' => function($q) {
                    $q->select(['id', 'name', 'customer_id', '(select COUNT(*) from orders where customer_id=order.id) AS thecount'])->having('thecount > 0');
                }])
            ->with(['orders.orderitems' => function($q) {
                    $q->select(['id', 'name', 'price', 'order_id']);
                }])
            ->with(['orders.orderitems.orderitemspictures' => function($q) {
                    $q->select(['id', 'src_thumb', 'orderitem_id'])->orderBy("id desc")->limit(1);
                }])
            ->select(['id'])
            ->asArray()
            ->one();

这是调试器执行的语句之一:

SELECT `id`, `src_thumb`, `orderitem_id` FROM `orderitempicture` WHERE `order_id` IN ('37', '42', '29', '36', '39', '41', '30', '40', '28', '38') ORDER BY `id` DESC LIMIT 1

现在我的问题在于这一行: $q->select(['id', 'src_thumb', 'orderitem_id'])->orderBy("id desc")->limit(1);

我想要做的是为每个orderitem获得一个orderitempicture,然而,发生的是将获得orderitempictures的SQL合并到一个语句中,并且限制应用于该语句,因此结果是我只得到一个订单,一个订单,我没有得到其他任何东西。

如何为每位家长设置限制以获得一个孩子?有没有办法告诉Yii为父级中的每条记录创建多个查询并设置限制而不是创建一个查询?

1 个答案:

答案 0 :(得分:0)

我想澄清一下如何应用one() - click here方法。 one()应该应用于ActiveQuery实例,其中查询返回一个ActiveRecord,但是根据asArray(),此方法可以返回一个数组。

我的建议是使用all() - click here。由于您的查询返回多个记录,因此可以使用all()将其转换为ActiveRecord实例的数组。