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
相关产品推荐
相关产品推荐

