2012-11-22 65 views
2

我被困在使用可包含行爲的CakePhp中查詢。 所以我有 - 型號訂購HABTM產品CakePhp包含無用條目的查詢

我想在特定狀態下訂購併且在特定餐館中至少有一種產品的訂單。

爲了您更好地理解,這裏是什麼樣子的模式

(int) 110 => array(
    'Order' => array(
     'id' => '10', 
     'customer_id' => '3', 
     'state_id' => '6', 
     'payment_id' => '3', 
     'created' => '2012-11-10 12:23:03', 
     'user_id' => '10', 
     'date_delivery' => '2012-10-12 20:30:00', 
     'km' => '2.76' 
    ), 
    'Product' => array(
     (int) 0 => array(
      'id' => '51', 
      'category_id' => '2', 
      'restaurant_id' => '10001', 
      'title' => 'aaa', 
      'description' => 'aaa', 
      'price' => '8.2', 
      'tva_id' => '2', 
      'img' => 'aaa', 
      'maj_img' => '2012-10-24 15:38:56', 
      'ProductsOrder' => array(
       'id' => '57', 
       'product_id' => '51', 
       'order_id' => '10', 
       'quantity' => '1', 
       'price' => '8.2', 
       'tva_id' => '2', 
       'meal' => null 
      ) 
))) 

(ProductsOrder是連接表)

所以,我使用中可容納的行爲,這裏是我的查詢:

$q = $this->Order->find('all', array(
     'conditions' => array(
      'Order.date_delivery BETWEEN ? AND ?' => array($dateDebut->format('Y-m-d H:i:s'), $dateFin->format('Y-m-d H:i:s')), 
      'Order.state_id' => array(6, 8)), 
     'order' => 'Order.date_delivery', 
     'contain' => array(
      'Product' => array(
       'conditions' => array('Product.restaurant_id' => $id), 
      ) 
     ) 
      )); 

問題是查詢的結果返回了一些我不想要的條目。 下面是一個例子,它是結果查詢的一部分,並不是假設存在。 請注意,Product是一個空數組。

109 => array(
    'Order' => array(
     'id' => '179', 
     'customer_id' => '139', 
     'state_id' => '6', 
     'payment_id' => '3', 
     'created' => '2012-11-18 22:29:16', 
     'user_id' => '10', 
     'date_delivery' => '2012-10-12 20:00:00', 
     'coursier_id' => '19', 
     'comment' => '', 
     'km' => '10.7' 
    ), 
    'Product' => array() 

您可能會來救我,如果你有什麼解決的想法... 謝謝

編輯轉儲SQL

SELECT COUNT(*)AS count FROM live_resto_managerrestaurants AS Restaurant WHERE Restaurantid = 10001

選擇OrderidOrdercustomer_idOrderstate_idOrderpayment_idOrdercreatedOrderuser_idOrderdate_deliveryOrdercoursier_idOrdercommentOrderkmlive_resto_managerorders AS Order WHERE Orderdate_delivery BETWEEN'2012-10-01 00:00:00'AND'2012-10-31 23:59:00'AND Order。 IN(6,8)Orderdate_delivery ASC

選擇ProductidProductcategory_idProductrestaurant_idProducttitleProductdescriptionProductpriceProducttva_idProductimgProductmaj_imgProductsOrderidProductsOrderproduct_idProductsOrderorder_idProductsOrderquantityProductsOrderpriceProductsOrdertva_idProductsOrdermeallive_resto_managerproducts AS Product JOIN live_resto_manager。 (。(99,100,102,105,101,103,104,1,58,3,106,108,2,31,107,109,110,111,59,112,114,115,117,118 ,61,113,33,116,60,119,120,121,122,4,62,34,123,63,124,125,5,6,126,129,127,128,130,131,133 ,132,134,135,138,137,139,140,141,64,136,142,143,35,36,37,144,145,146,147,149,148,150,151,152,153 ,7,154,155,65,156,158,159,161,8,157,162,160,163,9,165,166,66,164,168,38,167,169,39,170,171 ,172,173,67,174,175,68,69,176,177,178,179,10,40,180,181,182,192,183,184,186,187,70,185,189,190 ,12,188,191,193,13,14,41,194,11,195,15,71,196,197,200,201,72,198,199,202,16,73,203,42,204 ,205,74,206,207,208,209,43,210,212,44,211,45,17,76,213,214,215,75,77,216,78,217,218,219,79 ,220,221,222,223,80,224,46,225,81,18,229,233,226,227,228,230,231,232,234,47,236,235,237,238,239,239,221,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,213 ,19,242,243,244,48,49,50,240,241, 24,25,25,25,25,25,25,25,25,25,25,251,253,254,256,257,258,260,262,252,255,82,249,259,261,263, 267位,83位,84位,269位,85位,268位,270位,271位,86位,272位,21位,87位,274位,273位,275位,90位,276位,277位,88位,89位,278位,279位,280位,281位,282位, 284,285,287,288,283,91,22,286,289,290,294,298,24,291,292,295,296,297,25,52,92,93,本發明的實施方案包含如下實例:301,302,53,32,303,304,305,306,309,307,308,54,94,293,55,310,312,311,313,314,316,315,317,318,319,所述方法包括使用本文所述的方法,通過使用本發明的化合物或其鹽, 335,57,336,337,338)和ProductsOrderproduct_id = Productid)其中Productrestaurant_id = 10001

Whoooo這是很醜陋的

+0

空的Product數組是可容納行爲的預期結果。當Containable沒有來自相關數據庫表的結果時,它是標準的Contained返回一個包含模型的空數組。至於你的問題的其他部分,你可能想用find調用輸出的SQL和Product.restaurant_id的值和兩個日期來更新你的問題。爲什麼不應該將該訂單顯示在結果集中? – mensch

+0

那麼,如果產品將是空的,那麼爲了不返回條目,我需要做些什麼?我可以在PHP代碼中檢查它,但這不是我正在尋找的。 – azerto00

+0

恐怕這對於Containable來說是不可能的,你必須遍歷數組來過濾結果。本文提出了一個使用'afterFind()'的解決方案:http://nuts-and-bolts-of-cakephp.com/2008/08/06/filtering-results-returned-by-containable-behavior/ – mensch

回答

1

我會後的答案我的評論和闡述一下就可以了。首先,空的Product數組是Containable行爲的預期結果。當Containable沒有來自相關數據庫表的結果時,它是標準的Contained返回一個包含模型的空數組。

找到該訂單是因爲它的state_id爲6,並且date_delivery位於要求的範圍內。

您想要通過關聯的HABTM模型進行過濾,以便它在沒有附加任何產品時不返回訂單。使用Containable時,這意味着您必須手動過濾帶空產品陣列的訂單。 Containable只是「包含」返回的關聯模型數據的數量,它不會根據關聯模型的條件排除父模型。

您也可以忽略automagic Cake適用於相關型號,並使用joins調用find調用的參數,詳見this question的接受答案。還有一個bindModel技巧,在this thread的anwser部分有詳細介紹。

還有the Linkable behaviour它共享Containable的結構,但實際上執行連接。請注意,代碼長時間未更新,因此它可能無法在CakePHP 2中正常工作。*(有2.0叉,like this one,但我不能說更新的代碼庫的質量是多少)。

+0

謝謝你的解釋!它幫助我很多 – azerto00