1

我在使用多态关系的 laravel 应用程序中有 3 个模型和迁移

楷模

  • 属性
  • 属性值
  • 模型有属性

迁移

属性

Schema::create('attributes', function (Blueprint $table) {
    $table->id();
    $table->string('name');
    $table->timestamps();
});

属性值

Schema::create('attribute_values', function (Blueprint $table) {
    $table->id();
    $table->string('value');
    $table->foreignId('attribute_id')->constrained();
    $table->uuidMorphs('model');
    $table->timestamps();
});

模型有属性

Schema::create('model_has_attributes', function (Blueprint $table) {
    $table->id();
    $table->foreignId('attribute_id')->constrained();
    $table->foreignId('attribute_value_id')->constrained();
    $table->uuidMorphs('model');
    $table->timestamps();
});

现在,这里所有的属性都将仅使用属性模型创建,属性的值将使用所有其他模型创建,例如在我的案例中是类别模型。

Category类里面有这样的关系方法:

public function attributeValues()
{
    return $this->morphMany(AttributeValue::class, 'model');
}

问题:如何在Category模型中获取所有具有值的属性,您认为我的关系是正确的还是可以更好?

4

1 回答 1

0

为什么不只是:

Schema::create('attributes', function (Blueprint $table) {
    $table->id();
    $table->string('name');
    $table->string('value');
    $table->timestamps();
    $table->unsignedBigInteger('attributable_id');
    $table->string('attributable_type');
});

然后在属性模型中:

class Attribute extends Model
{
    public function attributable()
    {
        return $this->morphTo();
    }
}

在类别模型中:

class Category extends Model
{
    public function attributes()
    {
        return $this->morphMany(Attribute::class, 'attributable');
    }
}

编辑:

如果您真的希望每个属性具有一对多的属性值:

在迁移中:

Schema::create('attributes', function (Blueprint $table) {
    $table->id();
    $table->string('name');
    $table->timestamps();
    $table->unsignedBigInteger('attributable_id');
    $table->string('attributable_type');
});

Schema::create('attribute_values', function (Blueprint $table) {
    $table->id();
    $table->string('value');
    $table->timestamps();
    $table->unsignedBigInteger('attribute_id');
    
    $table->foreign('attribute_id')
          ->references('id')
          ->on('attributes')
});

然后在属性类中:

    public function values()
    {
        return $this->hasMany(AttributeValue::class);
    }

和 AttributeValue 类:

class AttributeValue extend Model
{
    public function attribute()
    {
        return $this->belongsTo(Attribute:class);
    }
}

现在我不记得 hasManyThrough 是否适用于多态关系,但是:

class Category extends Model
{
    public function attributes()
    {
        return $this->morphMany(Attribute::class, 'attributable');
    }

    public function attributeValues()
    {
        return $this->hasManyThrough(AttributeValue::class, Attribute::class)
    }
}
于 2020-06-30T09:04:45.967 回答