【问题标题】:SQL Server ON DELETE CASCADE Error In LaravelLaravel中的SQL Server ON DELETE CASCADE错误
【发布时间】:2020-06-20 05:59:11
【问题描述】:

我正在使用 Laravel 框架;我有多个连接的表,

用户架构表:

 Schema::create('users', function (Blueprint $table) {
        $table->bigIncrements('id');
        $table->string('name');
        $table->string('email')->unique();
        $table->timestamp('email_verified_at')->nullable();
        $table->string('password');
        $table->rememberToken();
        $table->timestamps();
    });

文章架构表:

Schema::create('articles', function (Blueprint $table) {
        $table->bigIncrements('id');
        $table->unsignedBigInteger('user_id');
        $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
        $table->string("title");
        $table->string("slug")->unique();
        $table->text("cover");
        $table->text("body");
        $table->boolean("status")->default(1);
        $table->timestamps();
    });

评论架构表:

        Schema::create('comments', function (Blueprint $table) {
        $table->bigIncrements('id');
        $table->unsignedBigInteger("user_id");
        $table->foreign("user_id")->references("id")->on("users")->onDelete('cascade');
        $table->unsignedBigInteger("article_id");
        $table->foreign("article_id")->references("id")->on("articles")->onDelete('cascade');
        $table->text("comment");
        $table->bigInteger("level");
        $table->boolean("status")->default(0);
        $table->timestamps();
    });

在 cmets 表中我有这个重要的代码:

$table->unsignedBigInteger("user_id");
        $table->foreign("user_id")->references("id")->on("users")->onDelete('cascade');
        $table->unsignedBigInteger("article_id");
        $table->foreign("article_id")->references("id")->on("articles")->onDelete('cascade');

我想在删除文章或用户时,我想在删除用户或文章时删除他们的 cmets,但这是 SQL Server 数据库中的错误。

错误表单 SQL Server 数据库enter image description here

当我删除这个方法时

->onDelete('级联');

错误消失了。

我肯定需要有相应的方法。谁能指导我解决这个问题?

【问题讨论】:

  • 您的问题是约束“article_favorite_user_id_foreign”。在图像上执行建议的 SQL 代码,直接在您的 MS SQL Server 上:alter tablearticles_favorite add constraint article_favorite_user_id_foreign on update cascade on delete cascade。

标签: php sql-server database laravel cascading-deletes


【解决方案1】:

改用删除观察者,on delete cascade 不是最好的做法。

User模型中定义关系:

/**
 * @return \Illuminate\Database\Eloquent\Relations\HasMany
 */
public function articles()
{
    return $this->hasMany(Article::class, 'user_id');
}

然后实现boot方法观察一条记录的删除

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

    static::deleting(function($user) {
        $user->articles()->delete();
    });
}

您可以使用相同的方法循环访问文章 cmets,或者执行与 ArticleComment 模型相同的操作

在此处阅读更多关于观察者的信息https://laravel.com/docs/5.8/eloquent#observers

【讨论】:

  • 这不能回答问题,也不适用于通过查询进行多次删除。
【解决方案2】:

您似乎正在使用cascade on delete,即使是访问它的user。我认为即使不是创建者但只能访问该列表的用户也不需要删除该列表。所以更新关注

改变

$table->foreign("user_id")->references("id")->on("users")->onDelete('cascade');

$table->foreign("user_id")->references("id")->on("users")->onDelete('no action');

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多