2015-09-28 50 views
3

我在使用Yii2構建查詢時遇到了問題。Yii2積極記錄帶有()回調函數的極限意外結果

比方說,我們有四個相關的模型:客戶,訂單,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合併爲一個狀態並且該限制適用於該陳述,所以結果是我只能得到一個訂單項的一個訂單圖,而其餘的我什麼也得不到。

我怎樣才能設置一個限制,讓每個家長獲得一個孩子?有沒有辦法告訴Yii爲父代中的每個記錄創建多個查詢,並設置限制而不是創建一個查詢?

+0

您正在使用'one()'。所以你總是從數據庫獲取一條記錄或具體。我真的不明白你在問什麼。 –

+0

我想要做的是爲每個訂購項目獲得一個orderitempicture。發生的事情是,我爲所有訂購項目總共獲得了一個訂單圖片。 –

回答

0

我想澄清關於如何將一個() - click here方法都可以應用。應該將one()應用於ActiveQuery實例,在查詢中返回一個ActiveRecord,但取決於asArray(),此方法可以返回一個數組。

我的建議是使用所有() - click here。由於您的查詢返回多個記錄,因此可以使用all()將其轉換爲一個ActiveRecord實例數組。

+1

我想你錯誤地理解asArray()。當您希望將值作爲數組返回而不是ActiveRecord對象時,可以使用它。您可以將一個記錄數據作爲一個數組返回而不是一個ActiveRecord,並且可以將多個記錄返回爲數組數組而不是一組ActiveRecords數組。 –

+0

我的意思是相同的,相應地編輯了答案。我所建議的是,只有當查詢返回一行時,才能應用one()方法,但在您的情況下,您期望多行並將one()應用於本應該是all() –