大家早上好,
首先,我要说的是,我使用了laravel,因此,它是一个很有说服力的orm,但我认为它更像是一个纯粹的关系数据库问题(或者不是),所以这就是我在这里提到它的原因。
有一段时间,我和 many-to-many
表和一对多表。
有以下4个相关表格:
“机器”(id、名称…)
“产品”(id、名称……)
“机器产品”(id、机器id、产品id、价格)。
“限制”(id、机器\产品\ id、日期、开始\小时、结束\小时)
对于特定的机器和产品,有n个限制条件。
到目前为止,我认为一切都很好,但当我想把它转化为拉威尔模型时,怀疑就开始了。
原则上,我们有以下三种模式:
机器
产品
限制
(机器产品???理论上没有必要)
正常情况下, many-to-many
模型不需要制作,因为它们可以通过两个主要模型之一访问。在这种情况下,从 Machine
或者 Product
我们可以访问数据透视表 machine_products
.
问题来自于 Machine
或者 Product
我想通过雄辩的方式 restrictions
. 同样地,我也不知道如何访问 Machine
或者 Product
通过一个示例 restrictions
.
我现在选择的一个选项是,尽管它只解决了第一个问题:
Restriction::find(Machine::find(1)->products()->first()->pivot->id);
我们可以建议一个更优雅和实用的解决方案,以获得产品/机器和向后的限制?
谢谢您!
编辑
我想要这样的东西: Machine::find(1)->products()->first()->restrictions
还是那个 Product::find(1)->machines()->first()->[pivot?]->restrictions
.
我也希望能够做到这一点: Restriction::find(1)->[pivot?]->machine
(或产品)
以下是三种模型:
class Machine extends Model
{
public function products()
{
return $this->BelongsToMany('App\Product', 'machine_products')->withPivot('id','price');
}
}
class Product extends Model
{
public function machines()
{
return $this->BelongsToMany('App\Machine', 'machine_products')->withPivot('price');
}
}
class Restriction extends Model
{
// Nothing
}
1条答案
按热度按时间l0oc07j21#
一般不建议(或没有必要)有一个
id
数据透视表中的列。我会把它取下来,调整一下
restrictions
表格:id
,machine_id
,product_id
, ...这就满足了您的第二个要求:
Restriction::find(1)->machine
相反的方向仍然是一个问题。我认为没有一个完美的解决方案:你可以用一个范围来简化它: