Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/259.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Laravel 5.1尝试删除项目时的QueryException_Php_Mysql_Laravel - Fatal编程技术网

Php Laravel 5.1尝试删除项目时的QueryException

Php Laravel 5.1尝试删除项目时的QueryException,php,mysql,laravel,Php,Mysql,Laravel,我正在构建一个东西,允许用户上传他们的图形作品,其他用户可以对项目和其他项目发表评论 现在,当用户想要删除他们自己的项目时,它可以工作,但一旦项目有评论或喜欢,我就会得到以下错误: Integrity constraint violation: 1451 Cannot delete or update a parent row: a foreign key constraint fails (`scotchbox`.`comments`, CONSTRAINT `comments_on_pr

我正在构建一个东西,允许用户上传他们的图形作品,其他用户可以对项目和其他项目发表评论

现在,当用户想要删除他们自己的项目时,它可以工作,但一旦项目有评论或喜欢,我就会得到以下错误:

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)
我假设这可以通过删除comments表中的注释和likes表中的likes来解决?但是我真的不知道如何用外键解决这个问题

我想我需要一种方法删除评论和喜欢的项目之前,删除项目本身。我的ProjectsController的destroy功能是否可以实现这一点? 这是我删除项目的销毁功能:

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

您尝试删除的用户对项目发表了评论。在删除用户之前删除他的评论。或者您试图删除的项目上有一条注释。

通过向我的迁移中添加onDelete('cascade')来修复它,如下所示:

迁移评论:

$table->foreign('on_projects')->references('id')->on('projects')->onDelete('cascade')

喜欢迁移:

$table->foreign('project_id')->references('id')->on('projects')->onDelete('cascade')


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

你有:用户,项目

用户有许多项目

这意味着在项目模式中,您将有类似的内容

 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');
 });
这意味着,如果您删除父项(用户),它将自动查找所有子项(项目),并为您逐个删除它们

最后,请注意,我使用了父母-子女类比来澄清这种情况,这种类比只适用于一对多关系


当你被数据库专家包围时,请避免使用这种类比,以避免进一步的后果。

很抱歉,我不确定我是否理解你的意思。我想我需要一种方法来删除项目的评论等。是的,检查你的外键,你需要删除与项目相关的记录,然后才能删除项目。我对Laravel很陌生,你能帮我吗?是否可以使用ProjectsController中的销毁功能从多个表中删除记录?