По моему мнению, одной из причин использования ORM является предотвращение дублирования записей в таблице. Для этого можно создать внешние ключи, чтобы связать несколько таблиц вместе.
Моя проблема заключается в следующем:
Таблица «адреса»:
+---------------+---------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------------+---------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| country_id | int(11) | NO | | NULL | |
| city_id | int(11) | NO | | NULL | |
| street_id | int(11) | NO | | NULL | |
| zip_id | int(11) | NO | | NULL | |
| street_number | int(11) | NO | | NULL | |
+---------------+---------+------+-----+---------+----------------+
Таблица «страны»:
+-------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | varchar(45) | NO | UNI | NULL | |
+-------+-------------+------+-----+---------+----------------+
(та же логика для других таблиц)
Когда я пытаюсь сохранить запись с уже существующим названием страны, я получаю уникальную ошибку mysql. Это понятно и абсолютно нормально. Все работает как задумано.
Вопрос заключается в следующем: какова наилучшая практика для сохранения сущностей с (уникальными) ассоциациями, которые уже существуют, и как можно получить идентификатор (внешний ключ) существующего (например, country.id), чтобы связать его в таблице адресов?
Есть ли какая-нибудь магия торта, которая подходит для моего случая?
Заранее спасибо,
Фил
Я думаю, что вы должны сначала разработать логическую модель отношений на бумаге и больше думать о возможных комбинациях данных и отношениях, прежде чем погрузиться в практику с помощью такой среды, как CakePHP.
Можно разделить данные на несколько таблиц, чтобы избежать двойных записей, но только если это имеет смысл. К сожалению, это не имеет смысла для всех полей в вашем примере адреса, и ваши отношения также кажутся нелогичными.
Также трудно что-то порекомендовать, не зная, что вы планируете делать или какие данные (адреса) вы говорите. Это частная адресная книга с несколькими ~ 100 записями или это приложение большого размера с тысячами или миллионами адресов из целой страны или даже из нескольких стран …
Пример 1: Города и почтовые индексы
city
может иметь множественный zip codes
(в некоторых странах) и один zip code
принадлежит один city
(по крайней мере, в пределах одной страны).
address
имеет один zip code
и один zip code
может быть связан с много addresses
,
Поскольку у вас есть эти отношения, вам не нужно подключать addresses
стол к cities
стол, как вы получаете city
имя через zip code
, Ваша линия связи: Address
имеет один zip code
тот принадлежит одному city
,
Пример 2: названия улиц
street name
может быть использован в множественный cities
и city
могу иметь множественный streets
, Это звучит как много ко многим подключение.Пример 3: номера улиц
Теперь к вашему главному вопросу в конце:
В CakePHP нет готовой к использованию «магии», чтобы справиться с этим. Сначала вы должны исправить ваши табличные отношения, затем вы можете работать с некоторыми инструментами (поведениями), предоставляемыми CakePHP, но для этого вида записей вам также придется кодировать собственную логику.
Если вы добавите новый адрес, вам нужно
находить списки связанных таблиц, задавать их к шаблонам просмотра и использовать их там с помощник формы создавать списки выбора (например, раскрывающийся список)
добавить ссылки в представлении add / edit-address-view для создания новых городов / почтовых индексов / чего угодно
А для удобной для пользователя формы ввода вам, вероятно, придется использовать некоторые javascript / Ajax, чтобы изменить параметры в выпадающих списках в соответствии с другими выбранными значениями, например, показывать только почтовые индексы, доступные для предварительно выбранного города, или добавлять новое название улицы на лету …
Этот ответ долго читать, но только заполнен некоторыми подсказками. Обратите внимание, что ваш вопрос слишком широк, чтобы ответить здесь подробно. Для следующего вопроса, пожалуйста, будьте более конкретны к проблеме, связанной с кодированием, добавьте примеры кода, а также посмотрите советы на Как спросить, благодарю вас.
Других решений пока нет …