You need to enable JavaScript to run this app. Laravel报错获取非对象属性user_name,如何通过slug获取单条帖子数据
优惠活动
大模型
产品
解决方案
定价
更多

Laravel报错获取非对象属性user_name,如何通过slug获取单条帖子数据

「Trying to get property 'user_name' of non-object」报错修正 & 单slug帖子页实现

核心问题定位

  • 模型与表结构错配:slug字段是存在user_post表中的,但你用关联系统用户表的User模型去按slug查询,根本无法匹配到有效数据
  • 查询结果格式错误:DB::select('select * from user_post')是无过滤的全表查询,返回的是包含多行stdClass对象的数组,既不是单个可直接通过->读取属性的对象,直接取$post_1->user_name必然触发非对象报错
  • 逻辑冗余无效:写了多段request()->input()读取表单提交值的代码,当前场景是做帖子详情展示,根本不需要读取前端提交的参数
  • 未实现slug匹配逻辑:查询user_post表时完全没有加slug过滤条件,不管传入什么slug参数,都会加载全表所有数据,从根源上做不到不同slug对应不同页面的需求

可落地的优化调整步骤

  • 为user_post表创建对应Eloquent模型,执行命令:php artisan make:model UserPost,这个模型会默认关联user_post表,和你编写的迁移结构完全匹配
  • 重写控制器方法,按slug精准查询单条数据,删除所有冗余代码:
// 控制器顶部引入对应模型
use App\Models\UserPost;

public function getsinglepost($slug)
{
    // 按slug过滤查询单条数据,查不到直接抛出404响应,从根源避免非对象取值报错
    $postDetail = UserPost::where('slug', $slug)->firstOrFail();
    // 将完整的帖子数据对象传给视图,不需要拆分单个字段重复传参
    return view('single', compact('postDetail'));
}

视图层配套调整

删除之前拆分单字段传参的冗余逻辑,直接从传入的帖子对象上读取对应字段即可,示例:

{{-- 直接读取对象属性展示对应内容 --}}
<div>发布人:{{ $postDetail->user_name }}</div>
<div>联系邮箱:{{ $postDetail->user_email }}</div>
<div>提问内容:{{ $postDetail->user_question }}</div>

避坑提醒

  • 查询单条数据时,优先使用first()/firstOrFail()/find()这类返回单对象的方法,不要使用get()——get()返回的是数据集合,哪怕仅匹配到1条记录,也无法直接通过->读取属性
  • 如果坚持使用DB门面写原生查询,必须补充slug过滤条件,且要注意DB::select返回的是数组结构,单条数据也需要通过数组索引取值,示例:DB::select("select * from user_post where slug = ?", [$slug])[0]->user_name

内容的提问来源于stack exchange,提问作者Burhan Janjua

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.25 04:45:04