3

使用 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其他表格无关。

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

4

4 回答 4

1

遵循 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表。

于 2009-03-26T00:51:51.380 回答
1

我喜欢KyleTravis 的建议,但您也可以将外键放在另一个方向。

如果您希望您的地址是独立的并且有几个其他表引用它们,那么您应该能够定义两个从客户到地址的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

于 2009-09-18T19:13:21.020 回答
0

杰克,

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

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

HTH,特拉维斯

于 2009-03-17T18:04:41.517 回答
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

于 2009-03-17T18:18:45.400 回答