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

如何使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 00:40:32