Как использовать несколько внешних ключей в одной таблице, ссылающейся на другую таблицу в cakephp - PullRequest
3 голосов
/ 17 марта 2009

Используя 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 автоматически связывалась по двум адресам

Ответы [ 4 ]

1 голос
/ 18 сентября 2009

Мне нравятся Кайл и Тревиса предложения, но вы также можете поставить внешние ключи в другом направлении.

Если вы хотите, чтобы ваши адреса были независимыми и на них ссылались несколько других таблиц, тогда вы сможете определить два отношения ownTo от клиента к адресу. Затем каждое отношение должно указывать, какое поле использовать в качестве внешнего ключа.

<?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 и т. Д. Тогда у вас есть стандартный шаблон дуги, и клавиши указывают правильное направление, поэтому вы получаете правильную ссылочную целостность.

Другое решение заключается в разработке более общей таблицы сущностей, которая имеет адрес в качестве дочерней таблицы. Тогда клиент, компания и сотрудник - все это подтипы таблицы сущностей. Для получения более подробной информации об этом стиле схемы я рекомендую Шаблоны моделей данных Дэвида Хэя.

1 голос
/ 26 марта 2009

Следуйте предложению Трэвиса Лелеу - потому что это хорошая идея, вне зависимости.

Затем добавьте поле enum в таблицу Addresses с именем table_id. Значением поля table_id может быть «customer», «vendor», «contact» и любые другие таблицы, которые будут ссылаться на таблицу адресов.

Также включите один внешний ключ с именем entity_id. Этот внешний ключ будет первичным ключом соответствующего клиента, поставщика или чего-либо еще.

Если вы, например, хотите указать платежный адрес для определенного поставщика, добавьте в массив $conditions:

'Address.entity_id'=>'123456'
'Address.table_id'=>'vendor'
'Address.type'=>'billing'

С этой настройкой вы можете иметь столько таблиц, сколько захотите, ссылаясь на таблицу Addresses.

0 голосов
/ 17 марта 2009

Если клиент обращается к 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

0 голосов
/ 17 марта 2009

Jack

Возможно, я не правильно понимаю вопрос, поэтому прошу прощения, если я неправильно истолковал.

Я бы, вероятно, просто сделал бы поле enum в таблице адресов, чтобы записать, какой это тип адреса (выставление счетов или рассылка). Затем вы можете использовать прямую связь $ hasMany между моделью ваших клиентов и моделью адресов. Когда вы выполняете запрос (например, вы просто хотите адрес для выставления счета для данного клиента), просто укажите в массиве $условий, что 'Address.type' => 'billing'.

НТН, Travis

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...