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

标签 php mysql laravel eloquent

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

例如,您有一个与 Products 具有 morphedByMany 关系的 Tag 模型,以及一个与标签具有 morphToMany 关系的 Product 模型。那么有了多态数据透视表,如果产品和/或标签被删除,如何删除数据透视表中的映射。

有一个标签表和一个 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();
    });

最佳答案

不确定如何通过数据库约束来实现这一点,但是您不能使用覆盖模型的启动方法吗?例如将其包含在您的产品模型中:

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

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

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

关于php - 对于laravel多态多态关系,如何添加数据库约束?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58063984/

相关文章:

java - 无法为 JSP 错误 tomcat、mysql 编译类

php - 更新查询返回1,但无法在php中使用MSSQL更新数据库

javascript - 如何让Flowplayer支持时间栏搜索?

php - 使用 PHP end() 函数分配新 id

php - fatal error : Call to undefined function mcrypt_get_iv_size() in AppServ

php - 如何创建允许用户拥有自定义字段的 PHP 应用程序

php - Mysql:在值更新之前锁定表以进行读取

css - 在 Laravel 的表单提交按钮中使用 Font Awesome?

php - Laravel AJAX 循环

php - 在 div 显示设置为阻止后没有任何显示