根据类型创建产品的属性表

时间:2015-12-26 15:28:36

标签: sql laravel eloquent

我在Laravel 5上创建应用程序并遇到问题。 我正在尝试创建产品的属性,这些属性依赖于属性类型(整数,字符串,布尔值)。

有一种'产品'表:

  • id - int,pk,ai,uns
  • name - string
  • code - string
  • price - float null

'属性'表:

  • id - int,pk,ai,uns
  • name - string
  • code - string

产品型号代码:

class Product extends Model
{
    public function properties()
    {
        return $this->belongsToMany(Property::class);
    }
}

物业型号代码:

class Property extends Model
{
    public function products()
    {
        return $this->belongsToMany(Product::class);
    }
    public function integers()
    {
        return $this->morphedByMany(PropertyInteger::class, 'property_type', 'product_property');
    }
    public function strings()
    {
        return $this->morphedByMany(PropertyString::class, 'property_type', 'product_property');
    }
}

PropertyInteger代码(ProductString代码相同):

class PropertyInteger extends Model
{
    public function properties()
    {
        return $this->morphToMany(Property::class, 'property_type', 'product_property');
    }
}

然后我试图获取产品的所有属性及其值:    (新的App \ Product) - > with([' properties',' properties.integers',' properties.strings']); 我得到的所有属性都属于产品型号,但在值中我获取了所有属性的所有值。

谢谢。

1 个答案:

答案 0 :(得分:0)

您的关系数据模型应该修改为:

Produts:
id - int, pk, ai, uns
name - string
code - string
price - float null

Properties:
id - int, fk(Products(id)), uns
pnum - short, ai(by id), uns
name - string
code - string
- pk(id, pnum)

我编写了语法来描述以下关系:Properties应该有一个复合主键(id, pnum),其中idProducts的外键(via {{ 1}})。如果给定产品只允许每种类型的一个属性,则id可以是表示类型的小整数(为了清楚起见,您甚至可能需要单独的定义表。

要获得与“属性”匹配的结果集,您将执行内部联接(如果要省略不具有“属性”的“产品”)或使用“产品”作为左侧表的左外部联接。在任何一种情况下,连接谓词都是pnum

Ergo -

Products.id = Properties.id