首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >删除()不使用laravel 8控制器

删除()不使用laravel 8控制器
EN

Stack Overflow用户
提问于 2021-09-20 07:00:31
回答 2查看 1K关注 0票数 0

我的Laravel有一个名为Blogpost的资源控制器,在破坏方法中,$blogpost->delete()方法不能工作。但是如果我使用DB查询,它就能正常工作。请参阅下面的代码。

--这不起作用:

代码语言:javascript
运行
复制
public function destroy(Blogpost $blogpost)
{
    $blogpost->delete();
    
    return redirect()->route('blog.index');
}

这是完美的工作:

代码语言:javascript
运行
复制
public function destroy($id)
{
    $post = Blogpost::find($id); 
    $post->delete();

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

在routes\web.php中,我使用这个控制器的资源路由。

代码语言:javascript
运行
复制
Route::resource('blog', BlogpostController::class);

注意:博客文章模型与postViews模型有一个hasMany()关系。

代码语言:javascript
运行
复制
public function postViews()
{
    return $this->hasMany(PostViews::class);
}

注意:post_views表与blogpost表有一个外键关联。见下文移徙:

代码语言:javascript
运行
复制
$table->foreign('blogpost_id')
              ->references('id')
              ->on('blogposts')
              ->onDelete('cascade');

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

代码:

代码语言:javascript
运行
复制
public function destroy(Blogpost $blogpost)
{
    dd($blogpost);
}

输出:

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

PS:我有另一个资源控制器,名为类别,其中的$category->delete()方法工作得很好。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-09-20 10:19:39

将您的destroy方法更改为:

代码语言:javascript
运行
复制
public function destroy(Blogpost $blog)
{
    $blog->delete();
    
    return redirect()->route('blog.index');
}

我可以想象这种情况发生的原因是因为您的路由参数是blog,而您的控制器参数是$blogpost,也就是说它们不匹配。

如果键入提示控制器方法参数,Laravel将尝试将解析为容器外的控制器方法参数的实例。这就是为什么您得到一个Blogpost实例,而不是您想要的加载实例。路由模型绑定不能在这里工作,因为名字必须匹配。

票数 1
EN

Stack Overflow用户

发布于 2021-09-20 11:13:16

你没有在控制器中设定模型。属性原始中的输出是null,因此不能删除post。现在,首先删除控制器model,然后在命令下面运行,然后尝试删除方法:

代码语言:javascript
运行
复制
php artisan make:controller BlogpostController --resource --model=Blogpost

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69250250

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档