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

Laravel如何优雅获取孙模型C的所有ID?

解决方法

方法1:直接通过关联条件查询C的ID(高效推荐)

无需加载整个A、B模型实例,直接通过关联筛选目标C的ID,性能最优:

// 假设C模型定义了关联b(),B模型定义了关联a()
$cIds = C::whereHas('b', function ($query) use ($a) {
    $query->where('a_id', $a->id);
})->pluck('id')->unique();

如果不需要去重(避免同一个C被多个B关联到同一个A),可以去掉unique()。

方法2:从已加载的关联数据中提取ID

如果你已经通过with加载了关联关系,可通过集合方法提取ID:

// 针对单个A实例,用load()加载关联(get()会返回A的集合,不是单个实例的关联)
$aWithRelations = $a->load(['B.C']);
$cIds = $aWithRelations->B->flatMap(function ($b) {
    return $b->C->pluck('id');
})->unique();

关于你之前的问题说明

你用A->with(['B.C'])->get()得到的是A的集合,每个A模型对象内部会包含B属性(关联的B集合),每个B对象又包含C属性。看不到关联内容可能是因为:

  • 直接输出集合时默认仅显示A的基础属性,可通过dd($aWithRelations->first()->B)查看关联的B数据;
  • 如果是操作单个A实例,应该用load()而非get(),get()会返回所有A的集合,而非单个实例的关联数据。

方法3:封装自定义逻辑(优雅复用)

在A模型中添加访问器或方法,封装获取C ID的逻辑,业务代码中直接调用即可:

// 在A模型类中
public function getCIdsAttribute()
{
    return C::whereHas('b', fn($q) => $q->where('a_id', $this->id))
        ->pluck('id')
        ->unique();
}

// 使用时直接调用
$cIds = $a->c_ids;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 15:20:33