CakePHP:不确定如何处理半难关系

时间:2011-04-11 14:36:53

标签: database cakephp relationship

我正在开发我的第一个CakePHP应用程序,一个订单/发票系统。订单部分很顺利,但对于发票我需要一些帮助。

我正在使用的database structure; 送货单包含多个产品,而这些产品又存在多个可重复使用的元素(如多个托盘和产品本身) 。现在,由于某些客户订购的数量较大,因此它们的费率较低,这是基于时间的(元素y从第1周到第9周,同一元素从第10周到第8周1.20)。当然,有些客户只需要使用每日价格,这些价格将以相同的方式存储,只需nulled customer_id。

现在我的问题;我完全不知道如何处理发票视图,或者更具体地说;最好的方法是获取数据,或者我应该去练习我的SQL编写技巧。

1 个答案:

答案 0 :(得分: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));

这会导致每个Element记录包含DefaultPrice,如果客户收到特殊定价,价格记录也将包括在内。

注意:您可能需要考虑在“元素”字段中添加 default_price 字段,并避免必须执行上面的其他连接。每个元素都有默认价格,对吗?