Laravel 5.1 QueryException尝试删除项目时

时间:2015-12-15 11:32:39

标签: php mysql laravel

我正在构建允许用户上传图形作品的内容,其他用户可以对项目进行评论,就像其他项目一样。

现在,当用户想要删除他们自己的项目时,它会起作用,但只要项目有评论或喜欢我就会收到此错误:

Integrity constraint violation: 1451 
Cannot delete or update a parent row: a foreign key constraint fails 
(`scotchbox`.`comments`, CONSTRAINT `comments_on_projects_foreign` FOREIGN KEY (`on_projects`) 
REFERENCES `projects` (`id`)) (SQL: delete from `projects` 
where `id` = 31 and `user_id` = 32)

我认为可以通过删除评论表中的评论和喜欢的表中的喜欢来解决这个问题吗?但老实说我不知道​​如何用外键解决这个问题。

我想在删除项目本身之前需要一种方法来删除项目的评论和喜欢。这可能来自我的ProjectsController的destroy函数吗?

这是我删除项目的销毁功能:

public function destroy($id)
{
    $input = Request::all();
    Project::whereId($id)->whereUserId(Auth::user()->id)->delete();
    return redirect('projects/');
}

3 个答案:

答案 0 :(得分:1)

您尝试删除的用户对项目发表了评论。删除用户之前删除他的评论。或者您尝试删除的项目有评论。

答案 1 :(得分:1)

当您有外键时,您可以选择删除行为。

您拥有:用户,项目

用户有很多项目

这意味着在Projects架构中你会有类似于这个

的东西
 Schema::create('projects', function(Blueprint $table){
    // table fields
    $table->integer('user_id')->unsigned();
    $table->foreign('user_id')->references('id')->on('users');
 });

在这种情况下,你建立了一种关系而没有说"如何表现"如果父项(用户)上发生删除,则表示如果您尝试删除该用户,则会抛出查询异常以保护您。

所以,如果是这种情况,你必须找到该父母的所有孩子(项目)(用户),并在你能够之前将其删除删除父母。

第二个解决方案是添加onDelete()行为:

 Schema::create('projects', function(Blueprint $table){
    // table fields
    $table->integer('user_id')->unsigned();
    $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
 });

这意味着,如果您删除父级(用户),它将自动查找所有子级(项目)并逐个删除它们。

最后,请注意我使用 Parent Children 类比来澄清情况,这个类比只适用于One to Many关系。

当您被数据库包围时,请避免使用类比来保护自己免受进一步的后果。

答案 2 :(得分:0)

通过将onDelete('cascade')添加到我的迁移中来解决此问题:

评论迁移:

  

$表 - >外国( 'on_projects') - >引用( 'ID') - >在( '项目') - > onDelete( '级联');

喜欢迁移:

  

$表 - >外国( 'PROJECT_ID') - >引用( 'ID') - >在( '项目') - > onDelete( '级联');