2011-04-11 40 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