22

Laravel 5.2 有非常好的 Helpers,我想用它们来做以下事情:

我有雄辩的模型集合:

$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']
]

有什么优雅的解决方案吗?

4

9 回答 9

31

我知道这不是最近的问题,但如果有人后来从谷歌偶然发现它,请参阅唯一的收集方法

$lesson->users()->only("id", "name")->toArray();应该是你所追求的。

于 2016-09-01T20:58:14.613 回答
13

拉拉维尔: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);
于 2019-04-01T07:17:45.800 回答
9

尝试这个:

$lesson->users()->select('id', 'name')->get()->toArray();
于 2016-05-10T15:10:57.403 回答
8

如果有人想“提取”多个属性并键入它们(示例结果由“名称”字段键入,“值”是项目本身 - 更改它以获取您感兴趣的属性数组):

$settings = \App\Setting::all()->map(function ($setting) {
    return ['key' => $setting->name, 'value' => $setting];
})->pluck('value', 'key')->toArray();
于 2018-04-19T12:20:52.363 回答
5

如问题所述,$lesson->users()返回“3 个用户的 Eloquent 集合”。这与users()课程模型上的关系不同,许多答案都错误地假设了这种关系,在这种情况下,它将返回一个查询构建器。

假设集合中的用户是 Eloquent 模型,从 Laravel 5.5 开始,你可以简单地这样做:

$lesson->users()->map->only('id', 'name');

如果用户是普通数组,则可以改为使用:

$lesson->users()->map(fn ($user) => Arr::only($user, ['id', 'name']));
于 2020-04-01T20:36:24.277 回答
5
$result = $lesson->users()->map(function($item){ 
  return array('id' => $item->id, 'name' => $item->name)
});

应该做的伎俩。

于 2018-08-14T12:49:59.607 回答
3

pluck() 辅助函数确实需要第二个参数。然后它将返回一个关联数组,其中第二个参数定义键。所以你会得到key => value对的结果。

如您所知,您的条目将由 id 和 name 组成,也许这会有所帮助:

$lesson->users->pluck('name', 'id')->toArray();

这将返回:

[
   10 => 'Michael Dook',
   16 => 'Henry Babcock',
   19 => 'Joe Nedd'
]

我不确定 Laravel 5.2,但这适用于 Laravel 5.5

于 2018-06-05T07:10:55.950 回答
1

If you have a collection of Models you can use:

$users->map->only('name', 'hobby');

// returns e.g.
// collect([
//     new User(['name' => 'matt', 'hobby' => 'coding']),
//     new User(['name' => 'tomo', 'hobby' => 'cooking']),
// ]);

This only works on Models because the only method is only available on Models, not on other items you might have in a Collection.

For a generic, more robust solution that works with Collections of mixed object types, arrays, etc., you can use the pluckMany macro I contributed to Spatie's laravel-collection-macros package:

$collection->pluckMany(['name', 'hobby']);

// returns e.g.
// collect([
//     (object) ['name' => 'marco', 'hobby' => 'drinking'],
//     (object) ['name' => 'belle', 'hobby' => 'cross-stitch'],
// ]);

For more details about pluckMany, see my blog post on How to pluck multiple items from a Laravel Collection

于 2021-09-28T11:07:30.390 回答
0

在 Laravel 6 中。^

集合方法->only()只返回集合中给定的 ID。

在该->get()方法中,您可以指定要返回的列。在集合上,您可以使用该方法->keyBy('id')设置数组的键。

要返回以 id 为键的记录以及包含 id 和 name 的数组,请使用以下代码:

$lesson->users()->get(['id', 'name'])->keyBy('id')->toArray()

于 2019-11-21T12:49:17.563 回答