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();
});
}
您可以使用相同的方法循环访问文章评论,或者使用 Article
和 Comment
模型
执行与此处相同的操作
在这里阅读更多关于观察者的信息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');
我正在使用 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();
});
}
您可以使用相同的方法循环访问文章评论,或者使用 Article
和 Comment
模型
在这里阅读更多关于观察者的信息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');