2014-12-20 2 views
0

Итак, я пытаюсь это сделать прошлой ночью, и несколько раз подумав о кругах, я решил помочь. Я задал вопрос о том, что поле ID не заполнено, но оно слишком длинное и запутанное, и я понял, что проблема, вероятно, основана на ассоциациях.Как правильно установить несколько ассоциаций между 3-мя моделями (CakePHP)

Я работаю над клиентской базой данных. Для крупных бизнес-клиентов отношения становятся немного сложными. У меня есть 3 модели, Customer, CustomerAddress и CustomerContact. У клиента может быть много адресов и много контактов, но контакты также основаны на одном адресе, поэтому адрес имеет много контактов.

Конечный результат, который я пытаюсь достичь, - это возможность поиска данных в обоих направлениях, например.

Customer -> Address 1 -> Contact 1, Contact 2, Contact 3, etc.... 
      Address 2 -> Contact ... ... ... 
      .... 

Или ....

Customer -> Contact 1 -> Address 
      Contact 2 -> Address 
      .... 

Проблема у меня в том, что адрес должен hasMany контакты и контакт должен hasOne адрес, но эти 2 отношения конфликта, потому что другая сторона должна belongsTo и это не так.

+0

Как минимум: в таблице контактов сохраните первичный ключ таблицы адресов. В таблице адресов сохраните первичный ключ таблицы Customer. Использование CakePHP с использованием _hasOne_ осложняет анализ. Ваш контакт _belongsTo_ адрес. FYI: hasOne не так распространен, как относится к схемам базы данных. – AgRizzo

+0

Да, сейчас у меня это работает, как в первом примере, который я опубликовал. Проблема в том, что я не могу искать контакты, не просматривая все адреса. – Dabrowski

+0

Отношения не обязательно должны быть взаимными. Почему вы не можете использовать адрес hasMany Contacts? –

ответ

0

Такое совпадение. Просто узнал об этом на прошлой неделе! Насколько я могу видеть, здесь основную схему отношений с

hasMany Клиент Адрес Адреса belongsTo Клиент

Адрес hasMany Контактной Контактной belongsTo Адрес

Теперь это покрывает основную модель первого случая вы хотите достичь. Поиск контакта с клиентом по адресу.

Что касается второго случая. Запросы от контакта к Клиенту будет могучей дорогой так, мое предложение

Создать соотношение:

hasMany клиентов Адрес и построить модель на вершине этой. Такое отношение называется hasMany, через которое две Модели имеют отношение hasMany, но имеют больше информации, верхом на вершине отношения. Например:

Группа hasAndBelongsToMany Пользователь пользователя hasAndBelongsToMany Группа

Это требует новую таблицу groups_users. Кроме того, каждая группа может иметь несколько администраторов. Предполагая, что мы следуем всем соглашениям 2.x. В этой таблице Cake не допускает дополнительных столбцов. Поэтому, если это отношение group_users рассматривается как модель. Мы можем добавить столько дополнительных столбцов, сколько хотим.

Отношение будет Группа принадлежит к массиву ('Пользователь', 'Группа'); Пользователь hasmany GroupUser Группа hasmany GroupUser

В вашем случае создайте отношение: Клиент имеет много адресов к модели. Позволяет вызвать CustomerAddress.

Тогда CustomerAddress hasMany Contact и Contact принадлежит клиентуAddress.

надеюсь, что это поможет!

Смежные вопросы