我的Laravel有一个名为Blogpost
的资源控制器,在破坏方法中,$blogpost->delete()
方法不能工作。但是如果我使用DB查询,它就能正常工作。请参阅下面的代码。
--这不起作用:
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');
}
在routes\web.php中,我使用这个控制器的资源路由。
Route::resource('blog', BlogpostController::class);
注意:博客文章模型与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->delete()
方法工作得很好。
发布于 2021-09-20 10:19:39
将您的destroy
方法更改为:
public function destroy(Blogpost $blog)
{
$blog->delete();
return redirect()->route('blog.index');
}
我可以想象这种情况发生的原因是因为您的路由参数是blog
,而您的控制器参数是$blogpost
,也就是说它们不匹配。
如果键入提示控制器方法参数,Laravel将尝试将解析为容器外的控制器方法参数的实例。这就是为什么您得到一个Blogpost
实例,而不是您想要的加载实例。路由模型绑定不能在这里工作,因为名字必须匹配。
发布于 2021-09-20 11:13:16
你没有在控制器中设定模型。属性和原始中的输出是null,因此不能删除post。现在,首先删除控制器和model,然后在命令下面运行,然后尝试删除方法:
php artisan make:controller BlogpostController --resource --model=Blogpost
https://stackoverflow.com/questions/69250250
复制相似问题