我正在构建一个应用程序,我在我的应用程序中有大约20个类别,每个类别都有一些自定义字段。因此,用户选择一个类别并填写自定义字段。之后我需要将值存储在DB中。你能说一下这样做的最佳方法吗?此外,我需要能够过滤此自定义字段 - 如高级过滤器和性能也是关键。
在这种情况下,我是否应该为每个类别创建一个单独的表及其自定义字段?
感谢您的帮助
达尼
答案 0 :(得分:2)
在关系数据库中实现实体 - 属性 - 值(EAV)模型的好处和缺点与Laravel一样,与几乎所有其他框架或语言一样。我不认为使用Laravel确实与这个问题有任何关系。
如果您的用例需要EAV的灵活性,并且您已准备好额外的复杂性(按一个数量级)并为大的性能影响做好准备......如果那些不是破坏者,那么使用EAV模型
但如果你不需要EAV的任何好处,那么一定要避免这些缺点。
答案 1 :(得分:1)
我可以想到两种选择。
1)在类别表中创建一个名为属性的JSON字段。然后基本上存储一组键值。但是,在查询属性时会遇到一些挑战。我知道有很多方法,但我从来不需要它,所以我不知道。
2)在您的数据库中创建类似属性表,类似于此
cat_id - int
key - varchar
value - varchar
Composite Index Unique on [cat_id, key,value ]
然后在laravel中创建一个Category Attribute模型并定义一个hasmany关系,其中Category有许多Category Attributes
然后查询你的类别将会是这样的
$categories = Category::whereHas('CategoryAttributes', function ($query) {
$query->where('key', '=', 'color');
$query->where('value','=', 'blue');
})->get();