SQL Laravel 中的服务器删除级联错误

SQL Server ON DELETE CASCADE Error In Laravel

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

用户架构Table:

 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();
    });

文章架构Table:

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();
    });

评论架构Table:

        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();
    });

在评论中 table 我有这个重要的代码:

$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');

我想当我删除文章或用户时,我希望在删除用户或文章时删除他们的评论,但这是 SQL 服务器数据库中的一个错误。

错误表单SQL服务器数据库: enter image description here

当我删除这个方法时

->onDelete('cascade');

错误消失。

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

改为使用删除观察器,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();
    });
}

您可以使用相同的方法循环访问文章评论,或者使用 ArticleComment 模型

执行与此处相同的操作

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

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

Change

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

to

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