对于Laravel多态多对多关系,您如何添加数据库约束?

9 浏览
0 Comments

对于Laravel多态多对多关系,您如何添加数据库约束?

对于Laravel的多态多对多关系,如何在数据库迁移中指定存在一个数据库约束,例如级联删除?例如,您有一个Tag模型,它与Products具有多态多对多关系,而Product模型与tags具有多态多对多关系。然后,如何在多态中的中间表中删除映射,以防删除产品和/或标签。有一个标签表和一个taggables表,它是将标签映射到taggable_type和taggable_id的中间表。

Product模型的片段:

/**
 * 标签关联
 *
 * @var $query
 */
public function tags(){
    return $this->morphToMany(Tag::class, 'taggable')->withTimestamps();
}
/**
 * 标签关联
 *
 * @var $query
 */
public function tag($tag){
    return $this->tags()->attach($tag);
}

Tag模型的片段:

/**
 * 产品关联
 *
 * @var $query
 */
public function products(){
    return $this->morphedByMany(Product::class, 'taggable')->withTimestamps();
}

taggables数据库迁移:

Schema::create('taggables', function (Blueprint $table) {
    $table->primary(['tag_id', 'taggable_id', 'taggable_type']); //这是为了避免重复关系
    $table->unsignedInteger('tag_id');
    $table->unsignedInteger('taggable_id');
    $table->string('taggable_type');
    $table->timestamps();
});

0
0 Comments

Laravel提供了一个多态多对多关系(polymorphic many-to-many relationships)的功能。但是,对于如何在数据库中添加约束条件,用户并不清楚。有人提出了通过覆盖模型的boot方法来实现。例如,在Product模型中包含以下代码:

protected static function boot()
{
    parent::boot();
    static::deleting(function ($product) {
        $product->tags()->detach();
    });
}

这意味着每当产品被删除时,所有相关的标签也会被删除。

0