cakephp 3.0 — Сохранение уникальных ассоциаций

По моему мнению, одной из причин использования 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), чтобы связать его в таблице адресов?

Есть ли какая-нибудь магия торта, которая подходит для моего случая?

Заранее спасибо,

Фил

-1

Решение

Я думаю, что вы должны сначала разработать логическую модель отношений на бумаге и больше думать о возможных комбинациях данных и отношениях, прежде чем погрузиться в практику с помощью такой среды, как 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: номера улиц

  • Лично я бы не использовал отдельную таблицу для номеров улиц, так как они часто бывают очень короткими и также могут быть «специальными», например «5», «632 б», «36826 3-й этаж» или что угодно.
  • (Я не совсем уверен в этом, но я думаю, что нет большой разницы в зависимости от времени запроса или размера базы данных, если вы сохраняете номер улицы непосредственно с адресом, поскольку внешний ключ может иметь аналогичную длину)

Теперь к вашему главному вопросу в конце:

В CakePHP нет готовой к использованию «магии», чтобы справиться с этим. Сначала вы должны исправить ваши табличные отношения, затем вы можете работать с некоторыми инструментами (поведениями), предоставляемыми CakePHP, но для этого вида записей вам также придется кодировать собственную логику.

Если вы добавите новый адрес, вам нужно

  • находить списки связанных таблиц, задавать их к шаблонам просмотра и использовать их там с помощник формы создавать списки выбора (например, раскрывающийся список)

  • добавить ссылки в представлении add / edit-address-view для создания новых городов / почтовых индексов / чего угодно

А для удобной для пользователя формы ввода вам, вероятно, придется использовать некоторые javascript / Ajax, чтобы изменить параметры в выпадающих списках в соответствии с другими выбранными значениями, например, показывать только почтовые индексы, доступные для предварительно выбранного города, или добавлять новое название улицы на лету …

Этот ответ долго читать, но только заполнен некоторыми подсказками. Обратите внимание, что ваш вопрос слишком широк, чтобы ответить здесь подробно. Для следующего вопроса, пожалуйста, будьте более конкретны к проблеме, связанной с кодированием, добавьте примеры кода, а также посмотрите советы на Как спросить, благодарю вас.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]