使用cakephp,我有一个通用地址表,我想链接到客户,供应商,联系人。大多数表只有1比1的关系,但我希望我的客户表有2个
也许是为了澄清: 我有一个客户表
id, int
mailing_address_id, int
billing_address_id, int
和地址表
id,int
addr, varchar
city, varchar
etc....
现在我知道我可以在地址表中添加customer_id
。但我不想这样做,因为我有一个供应商表,联系人表和其他所有将使用地址表的表。 customer_id
与其他表格并不真正相关。
我希望Customer模型自动链接到两个地址
答案 0 :(得分:1)
跟随Travis Leleu的建议 - 因为这是一个好主意,无论如何。
然后将枚举字段添加到名为Addresses
的{{1}}表中。 table_id
字段的值可以是“customer”,“vendor”,“contact”,以及其他任何表将链接到地址表。
还包括一个名为table_id
的外键。此外键将是相应客户,供应商或其他任何内容的主键。
例如,如果您想要某个供应商的帐单邮寄地址,请添加entity_id
数组:
$conditions
通过此设置,您可以拥有引用'Address.entity_id'=>'123456'
'Address.table_id'=>'vendor'
'Address.type'=>'billing'
表的任意数量的表。
答案 1 :(得分:1)
我喜欢Kyle's和Travis's建议,但您也可以将外键放在另一个方向。
如果您希望您的地址是独立的并且有其他几个表引用它们,那么您应该能够从客户到地址定义两个belongsTo relationships。然后,每个关系都必须指定要用作外键的字段。
<?php
class Customer extends AppModel {
var $name = 'Customer';
var $belongsTo = array(
'BillingAddress' => array(
'className' => 'Address',
'foreignKey' => 'billing_address_id'
),
'MailingAddress' => array(
'className' => 'Address',
'foreignKey' => 'mailing_address_id'
)
);
}
?>
但是,这两种解决方案都会让您对孤立地址开放,因为外键约束并不正确。最简单的解决方案可能是在地址表中添加一堆可选的外键,例如customer_id
,company_id
,employee_id
等。然后你有一个标准的弧形图案,键指向正确的方向,所以你得到了正确的参照完整性。
另一种解决方案是设计一个更通用的实体表,其地址为子表。然后,客户,公司和员工都是实体表的子类型。有关该架构风格的更多详细信息,我建议David Hay使用Data Model Patterns。
答案 2 :(得分:0)
杰克,
也许我没有正确理解这个问题,所以如果我误解了,我会道歉。
我可能只是在地址表中创建一个枚举字段来记录它是什么类型的地址(计费或邮寄)。然后,您可以在客户模型和地址模型之间使用直接$ hasMany关系。当您执行查询时(例如,您只需要给定客户的帐单邮寄地址),只需在$ conditions数组中指定'Address.type'=&gt;'billing'。
HTH, 特拉维斯
答案 3 :(得分:0)
如果客户HASMANY地址,请使用has-many关联:
http://book.cakephp.org/view/82/hasMany
如果客户HASONE(且只有一个)地址,请使用has-one关联:
http://book.cakephp.org/view/80/hasOne
如果客户可能共享相同的地址(相同的记录),则需要将HABTM与您提到的连接表一起使用。
有关Cake的关联的更多信息: http://book.cakephp.org/view/78/Associations-Linking-Models-Together