我在使用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为父级中的每条记录创建多个查询并设置限制而不是创建一个查询?
答案 0 :(得分:0)
我想澄清一下如何应用one() - click here方法。 one()应该应用于ActiveQuery实例,其中查询返回一个ActiveRecord,但是根据asArray(),此方法可以返回一个数组。
我的建议是使用all() - click here。由于您的查询返回多个记录,因此可以使用all()将其转换为ActiveRecord实例的数组。