Sql Yii2 activerecord在with()回调函数中使用limit时出现意外结果

Sql Yii2 activerecord在with()回调函数中使用limit时出现意外结果,sql,activerecord,yii2,yii2-model,Sql,Activerecord,Yii2,Yii2 Model,我在使用Yii2构建查询时遇到问题 假设我们有四个相关模型:Customer、Order、Orderitem和Orderitempicture 订单与客户相关,Orderitem与订单相关,Orderitempicture与Orderitem相关 代码如下: Customers::find() ->where(['id' => $id]) ->with(['orders' => function($q) {

我在使用Yii2构建查询时遇到问题

假设我们有四个相关模型:Customer、Order、Orderitem和Orderitempicture

订单与客户相关,Orderitem与订单相关,Orderitempicture与Orderitem相关

代码如下:

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被合并到一个语句中,并且限制被应用到该语句中,因此结果是一个orderitem只能获取一个orderitempicture,其余的则一无所获


我如何设置一个限制,让每一位家长有一个孩子?有没有办法告诉Yii为父记录中的每个记录创建多个查询,并对其设置限制,而不是创建一个查询?

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


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

您正在使用
one()
。所以你总是从数据库中得到一条记录,或者说是具体的。我真的无法理解您的要求。我正在尝试为每个orderitem获取一个orderitempicture。现在的情况是,我得到的所有orderitems总共有一个orderitempicture。我认为您对asArray()的理解是错误的。当您希望将值作为数组而不是ActiveRecord对象返回时,可以使用它。您可以将一个记录数据作为一个数组而不是一个ActiveRecord返回,也可以将多个记录作为数组而不是ActiveRecords数组返回。我的意思是相同的,相应地编辑了答案。我的建议是,只有当查询只返回一行时,才能应用one()方法,但在您的例子中,您需要多行,并对其应用一个()方法,而这应该是all()