полиморфные отношения laravel с обеих сторон

У меня есть 2 модели (Агентство и Клиент) и два типа местоположения: Штат и Город. Я хочу, чтобы можно было указать местоположение (любой из штатов ИЛИ городов) для агентств и клиентов.

┌──────────────┐  ┌──────────────┐    ┌───────────┐  ┌───────────┐
│ agencies     │  │ clients      │    │ states    │  │ cities    │
├──────────────┤  ├──────────────┤    ├───────────┤  ├───────────┤
│ id           │  │ id           │    │ id        │  │ id        │
│ name         │  │ ...          │    │ name      │  │ name      │
│ location...  │  │ location...  │    │ acronym   │  │ state_id  │
└──────────────┘  └──────────────┘    └───────────┘  └───────────┘

Я подумал о том, чтобы сделать полиморфизм из агентств и клиентов (обе таблицы будут иметь столбцы location_id и location_type), и это работает, но я хочу знать, есть ли какой-либо другой более умный и чистый способ сделать это (помните, что города принадлежат штатам, поэтому Я должен быть в состоянии сделать $model->location->state, если выбранное место для $model — город).


person Vitor Mattos    schedule 07.02.2020    source источник


Ответы (1)


Я не думаю, что есть. Лучший способ сделать это — создать таблицу location со следующими полями:

+-------------+-------------------------+------+-----+---------+----------------+
| Field       | Type                    | Null | Key | Default | Extra          |
+-------------+-------------------------+------+-----+---------+----------------+
| type        | enum('city','state')    | NO   |     | NULL    |                |
| parent_type | enum('agency','client') | NO   |     | NULL    |                |
| id          | int(11)                 | NO   | PRI | NULL    | auto_increment |
| parent_id   | int(11)                 | NO   |     | NULL    |                |
+-------------+-------------------------+------+-----+---------+----------------+

Затем вы должны вставить свои записи в эту таблицу, чтобы связать их.

Затем ваш $model->location->state возьмет city или state в зависимости от parent_type и parent_id.

person rattybag    schedule 07.02.2020