2010-08-14 112 views
0

我以這種方式連接的三種模式:用品 - >命令中─>付款
在CakePHP中需要一些幫助!

訂購的hasMany項目
訂購hasOne付款

現在,我分頁項目,並希望在其中添加條件以僅查找具有特定ID的支付的訂單的項目。我希望是有道理的:P

我加入的條件爲:

陣列( 'Payment.id'=> $ id)的

,但它不工作。顯然導致付款與項目無關。

那麼,我該怎麼辦呢?

+0

array('Item.Oder.Payment.id'=> $ id)解決了什麼問題? – 2010-08-14 09:58:33

+0

已經嘗試過......不起作用! – 2010-08-14 10:10:58

回答

1

我是cakephp的新手,或許我是完全錯誤的,但據我所知,您可以在控制器中使用$ uses變量中的其他模型。首先查詢付款模式以獲取您的訂單ID,然後使用此ID查找相應的項目。

$uses=array('Item','Order','Payment'); 
$order_id=$this->Payment->find('first',array('fields'=>'order_id','conditions'=>array('id'=>$payment_id))); 
$items=$this->Item->find('all',array('conditions'=>array('order_id'=>$order_id))); 

我希望它有幫助。

+0

它會幫助,只是一件事︰$ order_id ['Payment'] ['order_id']否則它會返回多維數組和$項目將是空的 – 2010-08-15 19:44:45

+0

這是好的,但怎麼能做到這一點與分頁? – 2010-08-15 19:53:27

+0

您可以使用$ limit和$ page作爲查找參數,也可以對其進行排序。你需要建立你自己的方式來解決分頁問題,​​因爲內置分頁程序有自己的障礙... 檢查了這一點:http://book.cakephp.org/view/73/Retrieving-Your-Data# find-449 – sipiatti 2010-08-16 20:11:50

0

你爲什麼不添加一個條件:

array('Order.payment_id'=>$id) 

我認爲這應該工作。

+0

嗯,訂單沒有payment_id ...付款有order_id在這種情況下作爲付款belongsTo訂單和訂單hasOne付款 – 2010-08-14 16:36:07

0

如果你指定你想要兩個遞歸級別,這應該工作。林假設你有

在Payment.php

//recursion level 1 
var $belongsTo = array('Order'); 
在Order.php

//recursion level 2 
var $hasMany = array('Items') 

你是正確的,對於PAGINATE工作必須查詢您希望將網頁模型和排序列出。

在PaymentController.php

//Query two levels deep, so the $payment['Order']['Item'][0-n] will be present 
var $paginate = array('recursive' => 2); 

注意這種方法確實產生另一個查詢的每一行取回物品。

+0

我已經嘗試了所有級別的遞歸值,但奇怪的是它沒有工作......你所假設的和你的解決方案是正確的,但我不知道什麼是錯的。 – 2010-08-19 19:21:12

0

確保app/config/core.php中的調試級別設置爲2以查看數據庫調用。

1)您可以使用Containable behaviour,在這種情況下,你需要把這個在您的產品型號:

var $actsAs = array('Containable'); 

,這爲您的項目控制器:

$items = $this->Item->find('all' 
    , array (
     'contain' => array('Order' => array('Payment')) 
     , 'conditions' => array('Payment.id' => $paymentId) 
    ) 
) 

但是我懷疑那將做一個左連接到付款表(作爲一個hasMany關係)。所以你不會以任何方式過濾項目。 2)如果你不能包含工作,那麼我經常在我的查詢中使用explict連接(閱讀這個bakery article by nate on joins)。因此,在您的物品控制器中,您將擁有:

$items = $this->Item->find('all' 
    , array (
     , 'joins' => array(
     array(
      'table' => 'payments' 
      , 'alias' => 'Payment' 
      , 'type' => 'INNER' 
      , 'conditions' => array(
       'Option.id = Payment.option_id' 
      ) 
     ) 
    ) 
     , 'conditions' => array('Payment.id' => $paymentId) 
    ) 
) 

您可能還需要指定選項表上的連接。

+0

這更像是它......會嘗試一下,讓你知道!非常感謝。 – 2010-08-20 13:15:08