delete()在laravel 8控制器上不起作用[重复]
Posted
技术标签:
【中文标题】delete()在laravel 8控制器上不起作用[重复]【英文标题】:delete() not working on laravel 8 controller [duplicate] 【发布时间】:2021-11-13 21:58:03 【问题描述】:我的 Laravel 项目有一个名为 Blogpost
的资源控制器,在 destroy 方法中,$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');
在 routes\web.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()
方法在其中完美运行。
【问题讨论】:
我猜你的路由参数叫做 id 而$blogpost
是空的?你有错误吗?试试dd($blogpost)
嗨@gert b,我正在使用资源路由。代码:Route::resource('blog', BlogpostController::class);
你dd($blogpost)
了吗?你有错误吗?
嗨@GertB。我刚刚做了 dd($blogpost),它返回 App\Models\Blogposts。看到这个截图:link
【参考方案1】:
TL;DR 将您的 destroy
方法更改为:
public function destroy(Blogpost $blog)
$blog->delete();
return redirect()->route('blog.index');
我想发生这种情况的原因是因为您的路由参数是blog
,但您的控制器参数是$blogpost
,即它们不匹配。
如果你输入一个控制器方法参数的提示,Laravel 将尝试从容器中解析出它的 一个 实例。这就是为什么你得到一个Blogpost
的实例而不是你想要的加载实例的原因。 Route model binding 在这里不起作用,因为名称必须匹配。
【讨论】:
【参考方案2】:您没有在控制器中设置模型。并且您在 attributes 和 original 中的输出为 null,因此您无法删除该帖子。现在,首先删除 controller 和 model 然后运行以下命令,然后尝试删除方法:
php artisan make:controller BlogpostController --resource --model=Blogpost
【讨论】:
以上是关于delete()在laravel 8控制器上不起作用[重复]的主要内容,如果未能解决你的问题,请参考以下文章
UIScreenEdgePanGestureRecognizer 在 iOS 8 上不起作用
为啥外部链接在构建后在 phonegap 应用程序上不起作用