如何在Laravel Blade模板中读取多层JSON值
如何在Blade中读取嵌套的JSON字段值
嘿,这个问题我碰到过!核心原因是你的content字段存储的是JSON字符串,而不是直接的对象/数组,所以没法直接用->field1访问。下面给你几种简单的解决方法:
方法1:在控制器中提前解析(推荐)
在获取到$employeeDetail之后,把content字段解码成对象或数组,这样模板里用起来更方便:
public function index() { $employeeDetail = new EmployeeDetail(); if (Auth::check()) { $id = Auth::user()->id; $employeeDetail = DB::table('employee_details')->where('user_id', $id)->first(); // 解析content字段,转成对象(如果要数组就加第二个参数true) if ($employeeDetail && !empty($employeeDetail->content)) { $employeeDetail->content = json_decode($employeeDetail->content); } dump($employeeDetail); } return view('myView', compact('employeeDetail')); }
之后在Blade模板里就能直接访问了:
{{ $employeeDetail->emp_id }} <!-- 原来的方式依然可用 --> {{ $employeeDetail->content->field1 }} <!-- 访问嵌套的field1 --> {{ $employeeDetail->content->field2 }} <!-- 访问嵌套的field2 -->
方法2:直接在Blade模板中解析
如果不想修改控制器,也可以在模板里临时解析:
@if($employeeDetail && !empty($employeeDetail->content)) @php // 解析成对象,或者用json_decode(..., true)转成数组 $contentData = json_decode($employeeDetail->content); @endphp <p>Field1: {{ $contentData->field1 }}</p> <p>Field2: {{ $contentData->field2 }}</p> @endif
方法3:用Eloquent访问器(最优雅)
如果你用的是Eloquent模型(EmployeeDetail),可以给模型加一个访问器,让它自动解析content字段,一劳永逸:
// App/EmployeeDetail.php class EmployeeDetail extends Model { // ...其他代码 // 定义content字段的访问器 public function getContentAttribute($rawContent) { // 转成对象,要数组就传true return json_decode($rawContent); } }
之后控制器里直接用模型查询就行,不用手动解析:
$employeeDetail = EmployeeDetail::where('user_id', $id)->first();
Blade里还是一样的用法:{{ $employeeDetail->content->field1 }}
注意事项
- 记得判断
content字段是否为空或者无效JSON,避免出现Trying to get property 'field1' of non-object的错误。 - 如果你的JSON格式可能有问题,可以给
json_decode加第三个参数true来处理错误,或者用json_last_error()排查问题。
内容的提问来源于stack exchange,提问作者Sivanandam
相关产品推荐
相关产品推荐

