![](/img/trans.png)
[英]Codeigniter - how to use the foreign keys from one table to look for the id's of another table
[英]How do I use multiple foreign keys in one table referencing another table in cakephp
使用 cakephp,我有一个通用地址表,我想将其链接到客户、供应商、联系人。 大多数表只有一对一的关系,但我希望我的客户表有 2
也许为了澄清:我有一张客户表
id, int
mailing_address_id, int
billing_address_id, int
和地址表
id,int
addr, varchar
city, varchar
etc....
现在我知道我可以在地址表中添加一个customer_id
。 但我不想这样做,因为我有一个vendors 表、contacts 表和其他所有都将使用addresses 表的表。 customer_id
与其他表并不真正相关。
我希望客户 model 自动链接两个地址
我喜欢Kyle和Travis 的建议,但您也可以将外键放在另一个方向。
如果您希望您的地址是独立的并且有几个其他表引用它们,那么您应该能够定义从客户到地址的两个belongsTo 关系。 然后,每个关系都必须指定使用哪个字段作为外键。
<?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 。
遵循 Travis Leleu 的建议 - 因为这是个好主意,无论如何。
然后在Addresses
表中添加一个名为table_id
的枚举字段。 table_id
字段的值可以是“customer”、“vendor”、“contact”,以及任何其他将链接到地址表的表。
还包括一个名为entity_id
的外键。 此外键将是相应客户、供应商或其他任何东西的主键。
例如,当您想要某个供应商的帐单地址时,请添加$conditions
数组:
'Address.entity_id'=>'123456'
'Address.table_id'=>'vendor'
'Address.type'=>'billing'
使用此设置,您可以拥有任意数量的表来引用Addresses
表。
杰克,
也许我没有正确理解这个问题,所以如果我误解了,我深表歉意。
我可能只是在地址表中创建一个枚举字段来记录它是什么类型的地址(帐单或邮寄)。 然后,您可以在您的客户 model 和您的地址 model 之间使用直接的 $hasMany 关系。 当您执行查询时(例如,您只需要给定客户的帐单地址),只需在 $conditions 数组中指定 'Address.type'=>'billing'。
HTH,特拉维斯
如果客户 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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.