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
相关产品推荐
相关产品推荐

