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() 函数会很有用,但它只能获取单个参数。但是我想获得带有 两个参数 idname 的输出,如下所示:

[
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 贡献的 pluckManylaravel-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