2011-04-11 41 views
0

我正在開發我的第一個CakePHP應用程序,一個訂單/發票系統。訂單部分很好,但對於發票我需要一些幫助。我使用的是; A 交貨單由多個產品組成,其依次存在多個可重複使用的元件(如多個托盤和產品本身)。現在因爲一些客戶訂購的數量較多,他們獲得較低的費率,這是基於時間的(從第1周到第9周,1元,第10周到第8周,同一元素爲1.20歐元)。當然,有些客戶只需要使用每日價格,這些價格將以相同的方式儲存,只需使用nulled customer_id即可。CakePHP:不確定如何處理半艱難的關係

現在我的問題;我完全不知道應該如何處理髮票視圖,或者更具體地說;獲得數據的最佳方式是什麼,或者如果我應該去練習我的SQL寫作技巧。

回答

0

我沒有看到您的模式的任何主要問題。 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領域,並避免做上面的附加連接。每個元素都將有一個默認的價格,對吧?

+0

謝謝,但問題是,一些元素定價需要基於日期。這是一家草莓加工公司,價格根據需求和季節而波動。 – marijnvdwerf 2011-04-11 16:00:54

+0

您通過在傳遞$ customer_id的contains參數中傳遞Price的附加條件來實現此目的。即:'Price.from'<= $ now /'Price.to'> = $ now。如果價格最終爲空,則應該默認爲DefaultPrice。 – Tyler 2011-04-11 16:45:04

+0

嗯,但由於我必須使用DeliveryNote.delivery_date,因此我想我必須首先獲取發票的所有DeliveryNotes,然後遍歷筆記以獲取所有元素。對? – marijnvdwerf 2011-04-11 18:44:17