Laravel关系:通过数据透视表上的

Laravel关系:通过数据透视表上的,laravel,orm,eloquent,Laravel,Orm,Eloquent,我在Laravel有3款车型: 项目 ModifierGroup 修改器 一个项可以通过一个中间表包含多个修改器组: public function modifierGroups() { return $this->belongsToMany( 'App\ModifierGroup', 'menu_item_modifiers', 'item_id', 'group

我在Laravel有3款车型:

项目
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()方法,使其具有表名和两个键。多对多文档很好地概括了这一点。干杯