如何使用with语句让Laravel关联返回ID数组而非对象数组?
问题描述
我有如下Laravel静态方法:
public static function list() { return static::with(['links' => function($query) { $query->select('link_id'); }])->get(); }
当前返回结果如下:
"objects": [ { "id": 6, "links": [ { "link_id": 6, "pivot": { "object_id": 6, "link_id": 6 } }, { "link_id": 7, "pivot": { "object_id": 6, "link_id": 7 } } ] } ]
想修改成返回以link_id值组成的ID数组,格式如下:
"objects": [ { "id": 6, "links": [6, 7] } ]
解决方案
分享几种实用的实现方式:
方法一:查询后用集合转换
在获取结果后,遍历每个对象,把links集合提取成link_id数组:
public static function list() { return static::with(['links' => function($query) { $query->select('link_id'); }])->get()->map(function($item) { $item->links = $item->links->pluck('link_id')->toArray(); return $item; }); }
方法二:模型访问器(全局生效推荐)
如果希望所有地方返回的links都是这种ID数组,可以在对应模型里加个访问器,自动转换:
// 你的模型类中添加这段代码 public function getLinksAttribute($value) { if ($value instanceof Illuminate\Database\Eloquent\Collection) { return $value->pluck('link_id')->toArray(); } return $value; }
加完这个,原来的list方法不用改,返回时links会自动变成ID数组。
方法三:直接查询关联ID
如果不需要加载关联模型的其他数据,也可以直接查询关联的link_id集合,省掉加载模型的开销:
public static function list() { return static::get()->each(function($item) { $item->links = $item->links()->pluck('link_id')->toArray(); }); }
注意:这种方式会触发N+1查询,数据量大的时候要谨慎,最好配合预加载优化或者用方法一。
内容的提问来源于stack exchange,提问作者rbalieiro
相关产品推荐
相关产品推荐

