如何在Laravel中为3表实现Relation

时间:2018-08-20 17:36:14

标签: laravel laravel-5 eloquent

我的database中有3个

  1. Product 表格以保存商品
  2. Options 表格,用于保留产品选项值,例如颜色,尺寸和其他值
  3. OptionGroups ,用于保留大小,颜色,内存和...等选项组。

在“选项”表中,我有product_id和optiongroup_id,值是这样的:产品ID 1的选项组ID为2,值X ...

我想为options中的每个product提供动态 db

我如何编写这些表之间的关系?

我了解many to manymany to many polymorphic的关系,但是这种关系是不同的。

最后,我希望在method模型中有一个Product,以便为每个OptionGroups分别获取Optionsproduct

任何想法或解决方案?

更新 下面的图片是我的数据库设计: enter image description here

1 个答案:

答案 0 :(得分:2)

如果产品选件将混合使用信息,则最好的方法没有任何关系。取而代之的是,您应该在products表中使用json字段选项。

在迁移时,您可以做:

$table->json('options');

然后在模型中,将其转换为数组

protected $casts = [ 'options' => 'array', ];

以后您可以用它来过滤

App\Product::where('options->color', 'red')->get()

您可以在此链接中找到将其用于User meta的完整示例:

Using mysql json field in Laravel

已编辑

在澄清评论后更新响应。

如果您不想使用json字段,则可以使用hasManyThrough relation来完成。

在您的情况下,一个产品通过 options 具有许多 optionsgroups ,因此您可以这样做:

    class Product extends Model
    {
        public function optionGroups()
        {
            return $this->hasManyThrough(
                'App\OptionGroups',
                'App\Option',
                'product_id', // Foreign key on options table...
                'option_id', // Foreign key on option_groups table...
                'id', // Local key on products table...
                'id' // Local key on options table...
            );
        }
    }

第二版

使用模型图片更新问题后,我更新了答案。如果有人发现它有用,我不会删除以前的原因

在Products和OptionsGroups之间有很多对多的产品,其中产品作为数据透视表。因此,根据文档,要从产品中检索组,您可以执行以下操作:

    class Product extends Model
    {
        public function optionGroups()
        {
            return $this->belongsToMany('App\OptionGroup', 'options');
        }
    }

诀窍在于关系的第二个参数:“ options”必须是在这种情况下充当枢轴的options表的名称。由于表名不遵守约定,Laravel无法自动执行此操作。 另外,可能还需要传递额外的参数来指定您正在使用的外键名称,例如在用户和角色的文档示例中:

return $this->belongsToMany('App\Role', 'role_user', 'user_id', 'role_id');

我认为,根据您的模型屏幕截图,您必须这样做:

return $this->belongsToMany('App\OptionGroup', 'options', 'product_id', 'optiongroup_id');

但是我建议您阅读有关的文档,并按照您的某些实际规范进行操作。 您可以在这里找到有关此信息的更多信息:many to many relationship

我希望这一定能解决您的问题。