Laravel 5.2 pluck() 来自 Eloquent 模型集合的多个属性
Laravel 5.2 pluck() multiple attributes from Eloquent Model Collection
Laravel 5.2 有非常好的助手,我想用它们来做以下事情:
我有Eloquent个模特合集:
$lesson->users(); // returns Eloquent collection of 3 users
pluck()
函数会很有用,但它只能获取单个参数。但是我想获得带有 两个参数 、id
和 name
的输出,如下所示:
[
1=>['id'=>10,'name'=>'Michael Dook'],
2=>['id'=>16,'name'=>'Henry Babcock'],
3=>['id'=>19,'name'=>'Joe Nedd']
]
有什么优雅的解决方案吗?
试试这个:
$lesson->users()->select('id', 'name')->get()->toArray();
我知道这不是最新的问题,但如果有人后来从 google 无意中发现它,请参阅 Only Collection Method
$lesson->users()->only("id", "name")->toArray();
应该是你想要的。
以防万一有人想要 "pluck" 多个属性并将它们作为键(示例结果由 "name" 字段作为键,'value' 是项目本身 - 将其更改为获取数组您感兴趣的属性):
$settings = \App\Setting::all()->map(function ($setting) {
return ['key' => $setting->name, 'value' => $setting];
})->pluck('value', 'key')->toArray();
pluck() 辅助函数需要第二个参数。然后它将 return 一个关联数组,其中第二个参数定义键。所以你会得到 key => value
对的结果。
如您所知,您的条目将包含 ID 和姓名,也许这会有所帮助:
$lesson->users->pluck('name', 'id')->toArray();
这将 return:
[
10 => 'Michael Dook',
16 => 'Henry Babcock',
19 => 'Joe Nedd'
]
我不确定 Laravel 5.2,但这适用于 Laravel 5.5
$result = $lesson->users()->map(function($item){
return array('id' => $item->id, 'name' => $item->name)
});
应该可以解决问题。
Laravel: 5.7
如果方法正在返回关系
使用get()
例如
$lesson = Lesson::find(1);
$lesson->users()->get(['id', 'name']);
合集
使用only()
$user = collect(['id' => 1, 'name' => 'Foo', 'role' => 'A']);
$user->only(['id', 'name']);
多个数组
$users = collect([
['id' => 1, 'name' => 'Foo', 'role' => 'A'],
['id' => 2, 'name' => 'Bar', 'role' => 'B'];
]);
$result = $users->map(function($user){
return Arr::only($user, ['id', 'name']);
});
var_dump($result);
在Laravel 6.^
收集方法 ->only()
只 return 收集给定的 ID。
在 ->get()
方法中,您可以指定要 return 的列。
在集合上,您可以使用方法 ->keyBy('id')
来设置数组的键。
对return以id为key的记录和包含id和name的数组使用如下代码:
$lesson->users()->get(['id', 'name'])->keyBy('id')->toArray()
如问题中所述,$lesson->users()
return 是 "Eloquent collection of 3 users"。这与 users()
是课程模型上的关系不同,许多答案都错误地假设了这种关系,在这种情况下它将 return 是一个查询构建器。
假设集合中的用户是 Eloquent 个模特,因为 Laravel 5.5 你可以简单地这样做:
$lesson->users()->map->only('id', 'name');
如果用户是普通数组,您可以改用:
$lesson->users()->map(fn ($user) => Arr::only($user, ['id', 'name']));
如果您有一个模型集合,您可以使用:
$users->map->only('name', 'hobby');
// returns e.g.
// collect([
// new User(['name' => 'matt', 'hobby' => 'coding']),
// new User(['name' => 'tomo', 'hobby' => 'cooking']),
// ]);
这仅适用于模型,因为 only
方法仅适用于模型,不适用于集合中可能包含的其他项目。
对于适用于混合对象类型、数组等集合的通用、更强大的解决方案,您可以使用我为 Spatie 贡献的 pluckMany
宏 laravel-collection-macros package:
$collection->pluckMany(['name', 'hobby']);
// returns e.g.
// collect([
// (object) ['name' => 'marco', 'hobby' => 'drinking'],
// (object) ['name' => 'belle', 'hobby' => 'cross-stitch'],
// ]);
有关 pluckMany 的更多详细信息,请参阅我在 How to pluck multiple items from a Laravel Collection
上的博客 post
Laravel 5.2 有非常好的助手,我想用它们来做以下事情:
我有Eloquent个模特合集:
$lesson->users(); // returns Eloquent collection of 3 users
pluck()
函数会很有用,但它只能获取单个参数。但是我想获得带有 两个参数 、id
和 name
的输出,如下所示:
[
1=>['id'=>10,'name'=>'Michael Dook'],
2=>['id'=>16,'name'=>'Henry Babcock'],
3=>['id'=>19,'name'=>'Joe Nedd']
]
有什么优雅的解决方案吗?
试试这个:
$lesson->users()->select('id', 'name')->get()->toArray();
我知道这不是最新的问题,但如果有人后来从 google 无意中发现它,请参阅 Only Collection Method
$lesson->users()->only("id", "name")->toArray();
应该是你想要的。
以防万一有人想要 "pluck" 多个属性并将它们作为键(示例结果由 "name" 字段作为键,'value' 是项目本身 - 将其更改为获取数组您感兴趣的属性):
$settings = \App\Setting::all()->map(function ($setting) {
return ['key' => $setting->name, 'value' => $setting];
})->pluck('value', 'key')->toArray();
pluck() 辅助函数需要第二个参数。然后它将 return 一个关联数组,其中第二个参数定义键。所以你会得到 key => value
对的结果。
如您所知,您的条目将包含 ID 和姓名,也许这会有所帮助:
$lesson->users->pluck('name', 'id')->toArray();
这将 return:
[
10 => 'Michael Dook',
16 => 'Henry Babcock',
19 => 'Joe Nedd'
]
我不确定 Laravel 5.2,但这适用于 Laravel 5.5
$result = $lesson->users()->map(function($item){
return array('id' => $item->id, 'name' => $item->name)
});
应该可以解决问题。
Laravel: 5.7
如果方法正在返回关系
使用get()
例如
$lesson = Lesson::find(1);
$lesson->users()->get(['id', 'name']);
合集
使用only()
$user = collect(['id' => 1, 'name' => 'Foo', 'role' => 'A']);
$user->only(['id', 'name']);
多个数组
$users = collect([
['id' => 1, 'name' => 'Foo', 'role' => 'A'],
['id' => 2, 'name' => 'Bar', 'role' => 'B'];
]);
$result = $users->map(function($user){
return Arr::only($user, ['id', 'name']);
});
var_dump($result);
在Laravel 6.^
收集方法 ->only()
只 return 收集给定的 ID。
在 ->get()
方法中,您可以指定要 return 的列。
在集合上,您可以使用方法 ->keyBy('id')
来设置数组的键。
对return以id为key的记录和包含id和name的数组使用如下代码:
$lesson->users()->get(['id', 'name'])->keyBy('id')->toArray()
如问题中所述,$lesson->users()
return 是 "Eloquent collection of 3 users"。这与 users()
是课程模型上的关系不同,许多答案都错误地假设了这种关系,在这种情况下它将 return 是一个查询构建器。
假设集合中的用户是 Eloquent 个模特,因为 Laravel 5.5 你可以简单地这样做:
$lesson->users()->map->only('id', 'name');
如果用户是普通数组,您可以改用:
$lesson->users()->map(fn ($user) => Arr::only($user, ['id', 'name']));
如果您有一个模型集合,您可以使用:
$users->map->only('name', 'hobby');
// returns e.g.
// collect([
// new User(['name' => 'matt', 'hobby' => 'coding']),
// new User(['name' => 'tomo', 'hobby' => 'cooking']),
// ]);
这仅适用于模型,因为 only
方法仅适用于模型,不适用于集合中可能包含的其他项目。
对于适用于混合对象类型、数组等集合的通用、更强大的解决方案,您可以使用我为 Spatie 贡献的 pluckMany
宏 laravel-collection-macros package:
$collection->pluckMany(['name', 'hobby']);
// returns e.g.
// collect([
// (object) ['name' => 'marco', 'hobby' => 'drinking'],
// (object) ['name' => 'belle', 'hobby' => 'cross-stitch'],
// ]);
有关 pluckMany 的更多详细信息,请参阅我在 How to pluck multiple items from a Laravel Collection
上的博客 post