2

封じ込め可能な振る舞いを使用したCakePhpのクエリで立ち往生しています。だから私は持っています-モデル注文HABTM製品

特定の州で注文し、特定のレストランで少なくとも1つの製品を注文したいのですが。

理解を深めるために、スキーマは次のようになります。

(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),
            )
        )
            ));

問題は、クエリの結果が不要なエントリを返すことです。これは、結果クエリの一部であり、そこにあるとは想定されていない1つの例です。 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(*)countASFROM live_resto_managerrestaurantsASWHERE 。Restaurant_ = 10001Restaurantid

SELECT OrderidOrdercustomer_idOrderstate_idOrderpayment_idOrdercreatedOrderuser_idOrderdate_deliveryOrdercoursier_idOrdercommentOrderkmFROM live_resto_managerordersASWHERE 。Order_ '2012-10-01 00:00:00' AND '2012-10-3123:59:00'AND 。IN(6、8)ORDERBY 。ASCOrderdate_deliveryOrderstate_idOrderdate_delivery

SELECT ProductidProductcategory_idProductrestaurant_idProducttitleProductdescriptionProductpriceProducttva_idProductimgProductmaj_imgProductsOrderidProductsOrderproduct_idProductsOrderorder_idProductsOrderquantityProductsOrderpriceProductsOrdertva_idProductsOrdermealFROM live_resto_managerproducts参加Productするlive_resto_managerproducts_ordersAS ProductsOrderON(ProductsOrderorder_idIN(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、18229、233、226、227、228、230、231、232、234、47、236、235、237、238、239、19、242、243、244、48、49、50、240、241、245、 20、51、246、247、248、250、251、253、254、256、257、258、260、262、252、255、82、249、259、261、263、265、264、266、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、23、299、300、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、95、 320、321、96、56、26、322、325、323、324、326、328、329、330、327、97、27、28、29、30、98、331、333、332、334、335、 57、336、337、338)および246、247、248、250、251、253、254、256、257、258、260、262、252、255、82、249、259、261、263、265、264、266、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、23、299、300、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、95、320、321 96、56、26、322、325、323、324、326、328、329、330、327、97、27、28、29、30、98、331、333、332、334、335、57、336、 337、338)および246、247、248、250、251、253、254、256、257、258、260、262、252、255、82、249、259、261、263、265、264、266、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、23、299、300、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、95、320、321 96、56、26、322、325、323、324、326、328、329、330、327、97、27、28、29、30、98、331、333、332、334、335、57、336、 337、338)および22、286、289、290、294、298、24、291、292、295、296、297、25、52、92、93、23、299、300、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、95、320、321、96、56、26、 322、325、323、324、326、328、329、330、327、97、27、28、29、30、98、331、333、332、334、335、57、336、337、338)および22、286、289、290、294、298、24、291、292、295、296、297、25、52、92、93、23、299、300、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、95、320、321、96、56、26、 322、325、323、324、326、328、329、330、327、97、27、28、29、30、98、331、333、332、334、335、57、336、337、338)およびProductsOrderproduct_id= Productid)WHERE Productrestaurant_id= 10001

うわーこれはかなり醜いです

4

1 に答える 1

1

答えとしてコメントを投稿し、少し詳しく説明します。まず、空のProduct配列は、Containable動作の意図された結果です。関連するデータベーステーブルからの結果がない場合、Containableは、含まれているモデルに対して空の配列を返すのが標準です。

注文はstate_id6でありdate_delivery、要求された範囲内にあるために見つかりました。

関連するHABTMモデルでフィルタリングして、商品が添付されていないときに注文が返されないようにします。Containableを使用する場合、これは、空のProduct配列を含む注文を手動でフィルタリングする必要があることを意味します。Containableは、返される関連モデルデータの量を「含む」だけであり、関連モデルの条件に基づいて親モデルを除外することはありません。

この質問で受け入れられた回答で詳しく説明されているように、関連するモデルに適用されるautomagic Cakeを無視してjoins、呼び出しのパラメーターを使用することもできます。このスレッドのanwserセクションで詳しく説明されているトリックもあります。findbindModel

Containableの構造を共有するが、実際には結合を実行するLinkable動作もあります。コードは長い間更新されていないため、CakePHP 2。*では正しく機能しない可能性があることに注意してください(このような2.0フォークがありますが、更新されたコードベースの品質はわかりません。 )。

于 2012-11-22T14:46:53.930 に答える