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

如何在PHP中通过条件控制JSON数据,移除无子分类时的空categories数组?

解决Laravel API Resource返回空分类数组的问题

我之前也碰到过一模一样的需求,不想在没有子分类的时候返回categories: []这种空数组,下面给你几个实用的解决思路:


方法1:使用Laravel Resource自带的when方法(推荐)

Laravel的API Resource专门提供了when方法来条件性地包含字段,非常适配这种场景。你只需要把categories字段用when包裹,只有当子分类存在且不为空时才返回这个字段:

// CategoryResource.php
public function toArray($request)
{
    return [
        'id' => $this->id,
        'name' => $this->name,
        // 只有当children不为空时,才会包含categories字段
        'categories' => $this->when(
            $this->children?->isNotEmpty(), // 用null安全运算符避免空指针报错
            CategoryResource::collection($this->children)
        ),
        'items' => ItemListResource::collection($this->items)
    ];
}

这个方法完全遵循Laravel的设计规范,代码简洁可读性强,还自动处理了children为null的边界情况。


方法2:PHP展开运算符动态构建数组

如果你习惯更直观的原生PHP语法,可以用展开运算符...来动态添加字段,只有满足条件时才把categories加入返回数组:

// CategoryResource.php
public function toArray($request)
{
    $baseData = [
        'id' => $this->id,
        'name' => $this->name,
        'items' => ItemListResource::collection($this->items)
    ];

    // 当子分类不为空时,追加categories字段
    if ($this->children?->isNotEmpty()) {
        $baseData['categories'] = CategoryResource::collection($this->children);
    }

    return $baseData;
}

或者更简洁的一行写法:

return [
    'id' => $this->id,
    'name' => $this->name,
    ...($this->children?->isNotEmpty() ? ['categories' => CategoryResource::collection($this->children)] : []),
    'items' => ItemListResource::collection($this->items)
];

这个方法逻辑清晰,适合喜欢原生PHP写法的开发者。


方法3:自定义ResourceCollection统一处理空集合

如果你的项目里有很多类似的嵌套资源需要处理空集合的情况,可以自定义一个ResourceCollection来统一规则:

// app/Http/Resources/CustomCollection.php
namespace App\Http\Resources;

use Illuminate\Http\Resources\Json\ResourceCollection;

class CustomCollection extends ResourceCollection
{
    public function toArray($request)
    {
        // 如果集合为空,返回null(对应字段会被自动排除出响应)
        return $this->collection->isEmpty() ? null : parent::toArray($request);
    }
}

然后在CategoryResource里替换默认集合:

'categories' => new CustomCollection($this->children),

这个方法适合需要全局统一处理空集合返回规则的场景。


验证效果

修改完代码后,当分类没有子分类时,响应里就不会出现categories字段了,完全符合你的需求!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 05:17:52