Laravel关系:通过数据透视表上的
我在Laravel有3款车型:Laravel关系:通过数据透视表上的,laravel,orm,eloquent,Laravel,Orm,Eloquent,我在Laravel有3款车型: 项目 ModifierGroup 修改器 一个项可以通过一个中间表包含多个修改器组: public function modifierGroups() { return $this->belongsToMany( 'App\ModifierGroup', 'menu_item_modifiers', 'item_id', 'group
项目
ModifierGroup
修改器
一个项
可以通过一个中间表包含多个修改器组
:
public function modifierGroups()
{
return $this->belongsToMany(
'App\ModifierGroup',
'menu_item_modifiers',
'item_id',
'group_id'
)->using('App\MenuItemModifier')
->orderBy('position', 'ASC')
->withPivot('position');
}
ModifierGroup
有许多修饰符
:
public function modifiers()
{
return $this->hasMany(
'App\Modifier',
'group_id',
'id'
)->orderBy('position', 'ASC');
}
我的问题是,是否有可能在
项
上有一个函数,通过修改器组
(及其轴)到达修改器
HasManyThrough
似乎不适合所涉及的透视表,是吗?这个问题可以通过使用透视表来解决,但不能通过使用透视表的方式来解决。由于我假设您有三个表-每个表都与您的模型关联(Item
,ModifierGroup
,Modifier
),您没有设置透视功能,因为您实际上没有透视表。为此,您需要一个表将项链接到修改器组
,另一个表将修改器组
链接到修改器
首先,让我们使用Artisan:
php artisan generate:pivot Item ModifierGroup
现在,我们有一个名为item_modifier_group(我相信?)的表。此表应该有两列,item_id和modifier_group_id。这些是Elount将用于连接到items和modifier_group表的键。现在,在我们的查询中,我们可以使用以下查询访问和项的修改器组:
public function modifierGroups()
{
return $this->belongsToMany('App\ModifierGroup');
}
这意味着当您调用$item->modifierGroups()
时,您将得到一个id为$item->id
的所有修改器组的集合
然后可以对修改器组
到修改器
关系重复此过程:
php artisan generate:pivot ModifierGroup Modifiers
现在在ModifierGroup
模型中定义修饰符方法:
public function modifiers()
{
return $this->belongsToMany('App\Modifier');
}
现在我们已经设置了透视表,并且在一个方向上定义了关系(只需向模型添加类似的方法,通过修饰符获取项目)
馅饼的最后一块是热切的装载(这太神奇了)获取项目,通过适当的组使用修饰符如下:
Item::with('modifierGroups.modifiers')->findOrFail('id');
现在有其他方法可以解决这个问题,有些甚至更有效,但是这种方法的巨大好处是灵活性。现在,您有了一种将项目、ModifierGroup和修饰符与透视表连接起来的方法,并且通过一个简单的即时加载查询,可以获得您认为必要的任何集合组合。希望这有帮助!这绝对是我在这里写过的最长的解决方案
对于以后的阅读,我建议:
php artisan generate:pivot Item ModifierGroup
-嵌套急加载
-多对多通过“跳过”ModifierGroup
表,可以使用归属关系
:
公共函数修饰符(){
返回$this->belongtomany(
“应用程序\修改器”,
“菜单项修改器”,
“项目id”,
“组id”,
无效的
“组id”
);
}
为什么您要准确地查看ModifierGroup表?您不只是在Item类上定义modifiers()方法,有什么原因吗?这也不完全是您使用透视表的方式。感谢您提供的长期解决方案!我确实有一个包含菜单项修改器的透视表,其中包含项id、组id和位置。如果是这种情况,那么您应该修改belongToMany()方法,使其具有表名和两个键。多对多文档很好地概括了这一点。干杯