我没有看到您的模式的任何主要问题。 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