Если бы вы применяли строгий дизайн отношений сущностей только к вашим машинам и продукту , ваша промежуточная таблица будет иметь только два столбца.
machine_id INT PK FK to machine.id
product_it INT PK FK to product.id
Это реализует отношение Machine :: many-to-many :: Product
.
Эта промежуточная таблица будет иметь составной первичный ключ.Уникальность первичного ключа будет диктовать, что каждая Машина может иметь только одно отношение с каждым Продуктом.Создайте отношение, вставив строку, и разорвите ее, удалив эту строку.
Но в вашем реальном приложении есть еще две вещи , цена и ограничение.Похоже, что ваше приложение диктует, что цены связаны как с машинами, так и с продуктами.
Итак, нам нужен другой объект, чтобы четко описать вашу заявку.Давайте назовем это Работа .Каждое задание имеет атрибут price
.Он использует одну машину, чтобы сделать один продукт.Следовательно, он имеет следующие отношения.
Machine :: many-to-one :: Job
Product :: many-to-one :: Job
Ваша machines_products
таблица, следовательно, не является чистой промежуточной таблицей «многие: многие».Вместо этого она называется таблицей заданий (или, как вы ее называете, таблицей MachineProduct).
Наконец, у вас есть сущность Ограничения с этим отношением
Job :: one-to-many :: Restriction
Итак, чтобы прояснить вашу модель Eloquent реального мира, добавьте эту сущность Job (MachineProduct) в вашу модель.Вся модель выглядит так.(Интересно, что в основе этого лежит сущность Job / MachineProduct.)
+-------------+ +------------+ +---------------+
| | /| |\ | |
| Product |-----| Job |-----| Machine |
| | \| |/ | |
+-------------+ +------------+ +---------------+
|
|
/|\
+-------------+
| |
| Restriction |
| |
+-------------+
Pro tip : Лучше четко определить свои сущности и отношения, прежде чем приступить к созданию таблиц.
Совет для профессионалов : Схему базы данных, вероятно, будет проще понять, если вы будете избегать имен столбцов, таких как machine.id
, и вместо этого будете использовать machine.machine_id
.Таким образом, вы можете говорить что-то подобное в своих запросах
FROM Job j JOIN Machine m ON j.machine_id = m.machine_id
вместо
FROM Job j JOIN Machine m ON j.machine_id = m.id
и не должны удивляться, подождать, что это за id
, и донне рискуйте сделать это по ошибке:
FROM Job j JOIN Product p ON j.machine_id = p.id /* wrong */