CakePHP 2模型关系多个外键

时间:2013-09-23 08:55:36

标签: php cakephp cakephp-appmodel

我有三张桌子:

  • 客户
  • 价格

架构示例:

客户有一个客户编号

项目可以有多个属于不同客户的价格

一个价格属于一个商品和一个客户

物品 - 型号:

class Item extends AppModel {
    public $hasOne = 'Price';
    //...
}

价格 - 型号:

class Price extends AppModel {

    public $belongsTo = array(
        'Item' => array(
            'className' => 'Item',
            'foreignKey' => 'id'
        )
    );

所以现在发生的事情是:One Item为3个不同的客户提供3种不同的价格。我自动获得所有项目(一项3次),但我只想要当前登录客户的项目(由customer_number标识,该表中显示的字段:

  • 客户
  • 价格

有什么建议吗?谢谢。

1 个答案:

答案 0 :(得分:2)

首先,请遵循CakePHP约定:您的customers表应该有一个id列。并且您的prices表应该有一个customer_id列,这是您的customers表的外键。如果您需要一个人性化的“客户编号”,与客户的ID(用于识别该客户)分开,那么它可以是客户表中的一个额外字段,但不应该复制到价格表中。

其次,您已在Item模型中定义了Item hasOne Price。这实际上不是真的 - 一个物品有很多价格 - 每个顾客一个。

在这种情况下你所追求的是HasMany through关系。阅读该文档 - 你最终会得到类似的东西:

// Customer.php
class Customer extends AppModel {
    public $hasMany = array(
        'Price'
    );
}

// Item.php
class Item extends AppModel {
    public $hasMany = array(
        'Price'
    );
}

// Price.php
class Price extends AppModel {
    public $belongsTo = array(
        'Customer', 'Item'
    );
}

您的价格表需要customer_id列和item_id列。

接下来,当返回当前登录客户的项目时,您可以在您的价格模型上查找,加入您的商品模型,其中price.customer_id等于相关客户的ID。