2013-08-22 79 views
0

我有三個型號,設備其中的hasMany 預訂,這反過來的hasMany PaypalTransaction得到的數據,我想找到屬於我正在處理的特定商品的預訂的PaypalTransactions,並且是在不到1天前創建的。所有這一切都在房源控制器CakePHP的 - 如何從一個模型 - >模型 - >模型類型的關係

所以在我的房源控制器我有

$oneDayAgo = date('Y-m-d H:i:s', strtotime('-1 day')); 
$toBeConfdBookings = $this->Equipment->Booking->PaypalTransaction->find('all', array('conditions' => array('PaypalTransaction.created' > $oneDayAgo))); 

所有車型中都有相應的關係,通過烘烤蛋糕創造,但什麼$ toBeConfdBookings最終是錯誤的。

有人告訴我我做錯了什麼?

+0

你說你想要什麼,什麼你正在嘗試不涉及 - 你想要的設備和/或預訂的條件在哪裏? – Dave

回答

1

答案很簡單:

不能在find()模型上的三深似運行。取而代之的是,儘量只加載模型,然後運行該find()

$this->loadModel('PaypalTransaction'); 
$oneDayAgo = date('Y-m-d H:i:s', strtotime('-1 day')); 
$toBeConfdBookings = $this->PaypalTransaction->find('all', array('conditions' => array('PaypalTransaction.created' > $oneDayAgo))); 

(你只能運行在加載模型或模式,都直接關係到加載模型find() S)


回答我是如何首先解釋你的問題的:

通常當你想拉相關的結果時,這非常簡單 - 只需使用CakePHP's Containable Behavior即可。

但是,您要做的是獲取相關模型數據根據相關模型限制結果。因此,由於Containable會創建單獨的查詢,因此無法根據相關模型進行限制 - 在這種情況下,您需要使用joins

代碼示例:

$oneDayAgo = date('Y-m-d H:i:s', strtotime('-1 day')); 
$this->loadModel('Booking'); // if neccessary 
$paypalTransactions = $this->Booking->find('all', array(
    'conditions' => array(
     'Booking.equipment_id' => $equipmentId 
    ), 
    'contain' => array(
     'Equipment' 
    ), 
    'joins' => array(
     array('table' => 'paypal_transactions', 
      'alias' => 'PaypalTransaction', 
      'type' => 'INNER', 
      'conditions' => array(
       'PaypalTransaction.booking_id = Booking.id', 
       "PaypalTransaction.created > '".$oneDayAgo."'" 
      ) 
    ) 
)); 

上面的代碼基本上寫着:

  1. 查找:發現由$equipmentId
  2. 所擁有的所有預訂包含:也檢索相關設備的數據(可選)
  3. 的加入:在預訂和支付寶交易只有那些經過前一天的交易發生的限制的結果(和檢索過的交易數據)
+0

可容納的是要走的路,我也會推薦它 – johhniedoe

0

你現在擁有它的方式基本上只是調用PaypalTransaction模型,並要求它發現在最後一天返回所有交易。

$this->FirstModel->SecondModel->ThirdModel並不意味着結果從第一種模式連接到第二,然後第三,這只是一個方式來幫助你加載而不是使用$this->loadModel('ThirdModel')加載它鏈接的模型。

所以你仍然需要根據你想要做的事情放置conditions。例如,如果這只是一個模型鏈接(假設$這個 - >預定設置爲記錄),你可以這樣做:

$this->Booking->PaypalTransaction->find('all', array(
    'conditions' => array(
     'PaypalTransaction.created >' => $oneDayAgo, 
     'PaypalTransaction.booking_id => $this->Booking->id 
    ) 
); 

你不能這樣,除非你的第三個模型中包含的密鑰擴展到2個額外的模型對於我懷疑它以前的模型(可能不應該))。

CakePHP會自動綁定belongsTo和hasOne關聯的查找條件中的模型,其餘兩種類型您需要爲joining your tables

這是一點額外的工作,但你很快就習慣了。