如何从集合结果数组中排除关系列 - 预加载

How to exclude the relation column from the collection result array- eager loading

我正在尝试弄清楚如何exclude/hide 急切加载收集结果数组中的关系列

我有 2 个模型,这是关系

Product.php

class Product extends Model
    {
        public function Category()
        {
            return $this->belongsTo(Category::class);
        }
    }

Category.php

class Category extends Model
    {
        public function Product()
        {
            return $this->hasMany(Product::class);
        }
    }

Table 字段

Category: id, name

Product: id, name, category_id

所以,这是我的查询

$result = Product::leftJoin('product_tags', 'product.id', 'product_tags.product_id')
        ->with(['category' => function ($q) {
            $q->selectRaw('id,name as category_name');
        }])
        ->select('product.id', 'product.name','product.category_id',DB::raw('group_concat(DISTINCT(product_tags.product_tag)) as product_tag'))
        ->groupBy('product_tags.product_id')
        ->paginate($limit)
        ->toArray();

这是回复

{
    "id": 50,
    "name": "three",
    "category_id": 2, // this field I need to exclude from result array
    "product_tag": "123,3",
    "category": {
        "id": 2,
        "category_name": "Azo"
    }
}

以下是我排除的回复

{
    "id": 50,
    "name": "three",
    "product_tag": "123,3",
    "category": {
        "id": 2,
        "category_name": "Azo"
    }
}

我试过这样做:

1.

$result['data'] = collect($result['data'])->except(['category_id']);
  1. $result['data'] = collect($result)->transform(function($i) { 取消设置($i->category_id); return$i; });

我什至尝试使用 except() 辅助函数,但似乎所有的努力都毫无意义

注意:我知道我可以在模型中设置受保护的属性($hidden 或 $visible),我可能想在不同的上下文中使用它并想使用默认分页 laravel.

这有可能吗?有什么方法可以做到吗?

非常感谢。

第一次尝试时,每个 child 都会有 category_id,而不是主数组。

collect($result)->map(function($item) {
    return collect($item)->except('category_id');
})->toArray();

在第二个上,您在主数组中使用了 toArray(),因此要取消设置 category_id,您需要使用 []

unset($i['category_id']);

PS:我看到paginate()这是端点的结果?在这种情况下,您可以查看 API Resource.

您可以使用makeHidden()方法。

$paginator = Product::leftJoin('product_tags', 'product.id', 'product_tags.product_id')
        ->with(['category' => function ($q) {
            $q->selectRaw('id,name as category_name');
        }])
        ->select('product.id', 'product.name','product.category_id',DB::raw('group_concat(DISTINCT(product_tags.product_tag)) as product_tag'))
        ->groupBy('product_tags.product_id')
        ->paginate($limit);

$result = $paginator->makeHidden(['product.category_id'])->toArray();