You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 06:35:09