laravel 5.4如何使用自定义异常处理查询异常

时间:2017-03-11 19:47:35

标签: laravel laravel-5 eloquent laravel-5.4

每当我尝试删除子表中相关歌曲的艺术家时。 它会返回此错误。

QueryException in Connection.php line 647:
SQLSTATE[23000]: Integrity constraint violation: 1451 Cannot delete or update a parent row: a foreign key constraint fails (`laravel`.`artist_song`, CONSTRAINT `artist_song_artist_id_foreign` FOREIGN KEY (`artist_id`) REFERENCES `artists` (`id`)) (SQL: delete from `artists` where `id` = 1)

这就是我想要的。保护父表,但我想要的是让最终用户看到这样的消息“你不能删除一个有相关歌曲的艺术家请删除这位艺术家的所有歌曲,首先'。所以我怎么能抓住这个自定义异常?

1 个答案:

答案 0 :(得分:0)

我认为您不必依赖数据库异常。当有人选择删除艺术家时,您应该验证艺术家是否有任何歌曲,如果是,则应该重定向并留言。

假设您的Artist模型关系定义如下:

public function songs()
{
   return $this->hasMany(Song::class);
}

在控制器中你可以使用这样的代码:

public function destroy($artistId)
{
    $artist = Artist::findOrFail($artistId);
    if ($artist->songs()->count()) {
       return redirect()->back()->with('message','You cannot delete ...');  
    }
    $artist->delete();
    return redirect()->route('artists.index'); 
}