删除()在laravel 8控制器上不起作用

2022-03-27 00:00:00 php laravel laravel-8 eloquent

我的Laravel项目有一个名为Blogpost的资源控制器,在销毁方法中,$blogpost->delete()方法不起作用。但是如果我使用DB Query,它会工作得很好。请参阅下面的代码。

这不起作用:

public function destroy(Blogpost $blogpost)
{
    $blogpost->delete();
    
    return redirect()->route('blog.index');
}

此功能运行良好:

public function destroy($id)
{
    $post = Blogpost::find($id); 
    $post->delete();

    return redirect()->route('blog.index');
}

在routesweb.php中,我对此控制器使用资源路由。

Route::resource('blog', BlogpostController::class);

注意:blogpost模型与postViews模型具有hasMany()关系。

public function postViews()
{
    return $this->hasMany(PostViews::class);
}
注意:post_views表具有与blogpost表关联外键。请参阅下面的迁移:

$table->foreign('blogpost_id')
              ->references('id')
              ->on('blogposts')
              ->onDelete('cascade');

如果我使用dd($blogpost);,它将返回模型。

编码:

public function destroy(Blogpost $blogpost)
{
    dd($blogpost);
}

输出:

我的问题是,为什么$blogpost->delete();方法不起作用?是因为hasMany()关系吗?

ps:我有另一个名为Category的资源控制器,其中$category->delete()方法工作正常。


解决方案

TL;DR将您的destroy方法更改为:

public function destroy(Blogpost $blog)
{
    $blog->delete();
    
    return redirect()->route('blog.index');
}

我认为发生这种情况的原因是因为您的路由参数是blog,但是您的控制器参数是$blogpost,即它们不匹配。

如果您键入控制器方法参数提示,Laravel将尝试将其实例解析出容器。这就是为什么您得到的是Blogpost的实例,而不是您想要加载的实例。Route model binding在此不起作用,因为名称必须匹配。

相关文章