我的database
中有3个表:
Product
表格以保存商品Options
表格,用于保留产品选项值,例如颜色,尺寸和其他值OptionGroups
表,用于保留大小,颜色,内存和...等选项组。在“选项”表中,我有product_id和optiongroup_id,值是这样的:产品ID 1的选项组ID为2,值X ...
我想为options
中的每个product
提供动态 db
。
我如何编写这些表之间的关系?
我了解many to many
和many to many polymorphic
的关系,但是这种关系是不同的。
最后,我希望在method
模型中有一个Product
,以便为每个OptionGroups
分别获取Options
和product
任何想法或解决方案?
答案 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。
我希望这一定能解决您的问题。