如何从集合结果数组中排除关系列 - 预加载
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']);
- $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();
我正在尝试弄清楚如何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']);
- $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();