我沒有看到您的模式的任何主要問題。 Containable行爲應該讓事情變得簡單。將它添加到您的發票型號:
var $actsAs = array('Containable');
讓你的生活增加了對每個元素DefaultPrice關係更容易。在您的元素模型中:
var $hasOne = array(
'DefaultPrice' => array(
'className' => 'Price',
'foreignKey' => 'element_id',
'conditions' => array('DefaultPrice.customer_id IS NULL')
)
);
現在構建您的發票,設置並向您的查找操作傳遞一個包含參數。 (我假設你想顯示的要素成本明細賬,對吧?)
$contain = array(
'DeliveryNote' => array(
'Product' => array(
'Element' => array(
'DefaultPrice',
'Price' => array(
'conditions' => array('Price.customer_id' => $customer_id)
)
)
)
)
);
$this->Invoice->find('first', array('conditions' => ..., 'contain' => $contain));
這將導致每個單元記錄包括DefaultPrice,如果客戶正在接受特殊定價,價格記錄也將被納入。
注:你可能要考慮,包括在元素域中一個default_price領域,並避免做上面的附加連接。每個元素都將有一個默認的價格,對吧?
謝謝,但問題是,一些元素定價需要基於日期。這是一家草莓加工公司,價格根據需求和季節而波動。 – marijnvdwerf 2011-04-11 16:00:54
您通過在傳遞$ customer_id的contains參數中傳遞Price的附加條件來實現此目的。即:'Price.from'<= $ now /'Price.to'> = $ now。如果價格最終爲空,則應該默認爲DefaultPrice。 – Tyler 2011-04-11 16:45:04
嗯,但由於我必須使用DeliveryNote.delivery_date,因此我想我必須首先獲取發票的所有DeliveryNotes,然後遍歷筆記以獲取所有元素。對? – marijnvdwerf 2011-04-11 18:44:17