我对多对多表id(主键)有一些疑问。根据laravel文档,多对多关系由两个模型和三个表组成。每个模型都有相应的表,中间表有as字段:
自动增量id
表1\u id
表2\u id
其他属性。。。
到目前为止,一切正常。我已经用了很多,用助手'pivot'访问字段,用'updateexistingpivot'更新这些字段等等。
我的问题是,是否值得从其他表的属性中利用中间表(如fk)的id。
例子:
在我的应用程序中,我有以下模型:
机器
产品
限制
这四张table:
机器(id,名称,…)[机器]
产品(id、名称……)【产品】
机器产品(id,机器id[fk],产品id[fk],价格)[无型号]
限制(id,machine\u product\u id[fk],day,begin\u hour,end\u hour)[限制]
给定特定的机器和产品,有n个限制。一个限制属于一个特定的机器和产品。
如您所见,我利用了autoincremental id(中间表的主键)来关联限制。但这样看来,与雄辩者合作有点奇怪,就像访问 Restriction
从 Machine / Product
反之亦然,这并不容易:
Restriction::where('machine_product_id', Machine::find(1)->products()->first()->pivot->id );
如果我能得到一个 Product
或者 Machine
从给定的 Restriction
,我必须从包含 machine_product_id
我的限制。
我不知道在使用elokent时,对于实用性和功能性问题,最好使用两个多对多表 machine_id and product_id
,一个是 price (machine_products)
另一个带着 day, begin_hour, end_hour (restrictions)
. 第一个表是1到1(机器产品)和其他1到n(限制)。我是说: machine_products
只有一个价格,给定一个特定的机器id和一个产品id。 restrictions
给定一个特定的机器id和产品id,将有n行集合,包括day、begin\u hour、end\u hour。
或者我做一个叫做 MachineProduct
? 我不知道。。。
你能告诉我或推荐解决这个难题的最佳方法吗?已经在修改表格、模型或其他任何东西了。
谢谢您。
1条答案
按热度按时间9ceoxa921#
如果您只对您的机器和产品实体应用严格的实体关系设计,那么中间表将只有两列。
这实现了
Machine :: many-to-many :: Product
关系。这个中间表将有一个复合主键。主键的唯一性将决定每台机器只能与每个产品有一个关系。通过插入一行来创建关系,并通过删除该行来切断关系。
但您的实际应用程序还有两个方面,价格和限制。看起来您的应用程序要求价格与机器和产品都有关系。
因此,我们需要另一个实体来清楚地描述您的应用程序。我们称之为工作吧。每个工作都有一个
price
属性。它用一台机器生产一种产品。因此它有这些关系。你的
machines_products
因此,表不是一个纯粹的many:many intermediate table。相反,它是并且应该被称为job表(或者您所说的machineproduct表)。最后,您有了一个具有此关系的限制实体
因此,为了让您的真实世界的雄辩模型更清晰,请将job(machineproduct)实体添加到您的模型中。整个模型是这样的(有趣的是,它的核心是job/machineproduct实体。)
专业提示:在开始创建表之前,最好弄清楚您的实体和关系。
专业提示:如果您避免使用诸如
machine.id
,而使用machine.machine_id
. 这样你就可以在你的询问中这样说了而不是
不用想,等等,什么
id
是这样的,不要冒着犯错的风险: