2012-11-22 62 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