Laravel中Blade视图调用含JSON的HasMany关联数据为空问题
Laravel JSON字段关联数据调用问题解决方案
问题根源
你将Divisi模型的perlengkapan_id字段存储为JSON数组,但默认的HasMany关联仅支持单一外键的等值匹配,无法解析JSON数组内的ID列表,导致预加载后关联的Perlengkapan数据为空。
正确配置步骤
1. 修正Divisi模型的关联方法
在Divisi模型中自定义关联逻辑,使用whereJsonContains匹配JSON数组中的ID:
// app/Models/Divisi.php use Illuminate\Database\Eloquent\Builder; use Illuminate\Support\Facades\DB; public function perlengkapans() { return $this->hasMany(Perlengkapan::class) ->whereJsonContains( $this->getTable() . '.perlengkapan_id', DB::raw('perlengkapans.id') ); }
注:Laravel 8+版本可直接使用上述语法,低版本需调整
DB::raw的写法确保兼容性。
2. 控制器预加载保持不变
控制器中仍正常使用with预加载关联数据:
// 控制器代码示例 $divisis = Divisi::with('perlengkapans')->get(); return view('your-view-name', compact('divisis'));
3. Blade视图正确调用数据
循环遍历关联数据即可直接获取Perlengkapan的name字段:
@foreach($divisis as $divisi) <div> <h4>{{ $divisi->name }}</h4> <p>关联设备:</p> <ul> @foreach($divisi->perlengkapans as $item) <li>{{ $item->name }}</li> @endforeach </ul> </div> @endforeach
长期优化方案
如果业务场景允许,建议替换JSON存储为多对多中间表,这是Laravel处理多关联的标准模式:
- 创建
divisi_perlengkapan中间表,包含divisi_id和perlengkapan_id两个字段 - 修改
Divisi模型关联:public function perlengkapans() { return $this->belongsToMany(Perlengkapan::class); } - 修改
Perlengkapan模型关联:public function divisis() { return $this->belongsToMany(Divisi::class); }
这种方式避免了JSON字段的查询限制,后续维护和扩展更便捷,性能也更稳定。
内容的提问来源于stack exchange,提问作者Aditya Budi
相关产品推荐
相关产品推荐

