如何在一个表中使用多个外键引用cakephp中的另一个表

如何在一个表中使用多个外键引用cakephp中的另一个表,php,cakephp,Php,Cakephp,使用cakephp,我有一个通用地址表,我想链接到客户、供应商和联系人。大多数表只有1对1的关系,但我希望我的客户表有2对 或许需要澄清: 我有一张顾客桌 id, int mailing_address_id, int billing_address_id, int 和地址表 id,int addr, varchar city, varchar etc.... 现在我知道我可以在addresses表中添加一个customer\u id。但我不想这样做,因为我有一个vendors表、conta

使用cakephp,我有一个通用地址表,我想链接到客户、供应商和联系人。大多数表只有1对1的关系,但我希望我的客户表有2对

或许需要澄清: 我有一张顾客桌

id, int
mailing_address_id, int
billing_address_id, int
和地址表

id,int
addr, varchar
city, varchar
etc....
现在我知道我可以在addresses表中添加一个
customer\u id
。但我不想这样做,因为我有一个vendors表、contacts表和其他表,它们都将使用addresses表。
customer_id
实际上与那些其他表不相关

我希望客户模型自动链接两个地址

也许我没有正确理解这个问题,所以如果我误解了,我道歉

我可能只是在地址表中创建一个enum字段来记录它是什么类型的地址(账单或邮件)。然后,您可以在客户模型和地址模型之间使用直接的$hasMany关系。执行查询时(例如,您只需要给定客户的帐单地址),只需在$conditions数组中指定“address.type”=>“billing”

嗯,,
Travis

如果客户有多个地址,请使用has many关联:

如果客户有一个(且只有一个)地址,请使用has-one关联:

如果客户可能共享相同的地址(相同的记录),则需要将HABTM与您提到的联接表一起使用

有关蛋糕协会的更多信息:

听从特拉维斯·勒鲁的建议——因为不管怎样,这是个好主意

然后向名为
table_id
Addresses
表中添加一个enum字段。
table_id
字段的值可以是“customer”、“vendor”、“contact”,以及链接到addresses表的任何其他表

还包括一个名为
实体\u id
的外键。该外键将是相应客户、供应商或其他任何人的主键

例如,当您需要某个供应商的帐单地址时,请添加
$conditions
数组:

'Address.entity_id'=>'123456'
'Address.table_id'=>'vendor'
'Address.type'=>'billing'
使用此设置,您可以有任意多个表,以引用
地址
表。

我喜欢这些信息和建议,但您也可以将外键放到另一个方向

如果您希望您的地址是独立的,并且有几个其他表引用它们,那么您应该能够从客户到地址定义两个。然后,每个关系都必须指定要用作外键的字段

<?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'
        )
    );  
}
?>

但是,这两种解决方案都会使您面临孤立地址,因为外键约束实际上并不正确。最简单的解决方案可能是向地址表添加一组可选外键,如
客户id
公司id
员工id
,等等。然后你得到了一个标准的圆弧模式,关键点指向正确的方向,所以你得到了正确的引用完整性


另一个解决方案是设计一个更通用的实体表,该表将地址作为子表。然后,customer、company和employee都是实体表的子类型。关于这种模式的更多细节,我推荐David Hay。

为了清晰起见,我编辑了我的问题。如果我可以在我的设置中使用hasMany或hasOne,我不知道如何使用。你看过cakephp网站上的博客教程了吗?它超越了表关联。虽然我希望有一个更自动化的解决方案,但这个解决方案将足够好。这对我有帮助,但如果地址同时是供应商和客户,会不会有问题?