提问者:小点点

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


对于 Laravel 的多态多对多关系,如何在数据库迁移中指定数据库约束应该存在,例如,级联?

例如,您有一个Tag模型,它与Products有morphydBy关系,还有一个Product模型与tags有morto多国关系。然后有一个多态数据透视表,如果产品和/或标签被删除,您如何删除数据透视表中的映射。

有一个tags表和一个taggables表,它是将标记映射到taggable_type和taggable_id的数据透视表。

产品模型的片段

/**
     * Tag relation
     *
     * @var $query
     */
    public function tags(){
        return $this->morphToMany(Tag::class, 'taggable')->withTimestamps();
    }

    /**
     * Tag relation
     *
     * @var $query
     */
    public function tag($tag){
        return $this->tags()->attach($tag);
    }

标签模型的片段

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

标记数据库迁移

Schema::create('taggables', function (Blueprint $table) {
        $table->primary(['tag_id', 'taggable_id', 'taggable_type']); //This is to avoid duplicate  relationships

        $table->unsignedInteger('tag_id');
        $table->unsignedInteger('taggable_id');
        $table->string('taggable_type');

        $table->timestamps();
    });

共1个答案

匿名用户

不知道如何利用数据库约束来实现这一点,但是您能不能不利用覆盖模型的引导方法呢?例如,在您的产品模型中包含以下内容:

protected static function boot()
{
    parent::boot();

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

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