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

Laravel中基于纯ID数组JSON字段的HasMany关联实现问题

实现方案

1. 依赖确认

确保已安装staudenmeir/eloquent-json-relations包,未安装则执行:

composer require staudenmeir/eloquent-json-relations

2. 模型关联定义

在RecurringOrder模型中,直接使用包提供的HasManyJson关联类型,指定关联模型、关联模型的主键字段、本地存储ID数组的JSON字段:

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use Staudenmeir\EloquentJsonRelations\Relations\HasManyJson;

class RecurringOrder extends Model
{
    protected $fillable = ['transaction_ids'];
    protected $casts = ['transaction_ids' => 'array']; // 自动完成数组与JSON的转换

    public function transactions(): HasManyJson
    {
        // 参数顺序:关联模型、关联模型的主键、本地JSON数组字段
        return $this->hasManyJson(Transaction::class, 'id', 'transaction_ids');
    }
}

Transaction模型无需额外配置(如需反向关联可自行添加):

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Transaction extends Model
{
    // 模型基础配置
}

3. 预加载使用

直接按需求执行预加载查询,包会自动生成数据库兼容的JSON包含查询,支持批量预加载:

$recurringOrder = RecurringOrder::with(['transactions', 'other', 'relations'])
    ->where(...)
    ->first();

// 直接访问关联数据
dump($recurringOrder->transactions); // 得到对应的Transaction集合

关键说明

  • 该方案无需自定义Trait或中间表,纯ID数组场景只需明确hasManyJson的参数顺序即可,属于包的原生支持能力。
  • 数据库字段要求:recurring_orders.transaction_ids需定义为JSON类型(MySQL用JSON,PostgreSQL用jsonb),配合模型的$casts配置可自动处理格式转换。
  • 预加载支持:关联内部会自动处理批量查询,避免N+1问题,完全符合需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 11:01:15