Laravel 5.2有非常好的助手,我想用它们做以下事情:
我有Eloquent Model Collection:
$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']
]
这有什么优雅的解决方案吗?
答案 0 :(得分:25)
我知道这不是最近的问题,但如果有人稍后会从谷歌发现它,请参阅Only Collection Method
$lesson->users()->only("id", "name")->toArray();
应该是您追求的目标。
答案 1 :(得分:6)
试试这个:
$lesson->users()->select('id', 'name')->get()->toArray();
答案 2 :(得分:5)
如果有人想“摘取”多个属性并键入它们(示例结果由“name”字段键入,“value”是项本身 - 将其更改为获取您感兴趣的属性数组):
$settings = \App\Setting::all()->map(function ($setting) {
return ['key' => $setting->name, 'value' => $setting];
})->pluck('value', 'key')->toArray();
答案 3 :(得分:3)
如问题所述,$lesson->users()
返回“ 3个用户的口才集合”。这和users()
是一个Lesson模型上的关系是不一样的,它错误地假定了许多答案,在这种情况下,它将返回查询生成器。
假设集合中的用户是Eloquent模型,由于Laravel 5.5,您可以轻松地做到这一点:
$lesson->users()->map->only('id', 'name');
如果用户是纯数组,则可以改用:
$lesson->users()->map(fn ($user) => Arr::only($user, ['id', 'name']));
答案 4 :(得分:1)
$result = $lesson->users()->map(function($item){
return array('id' => $item->id, 'name' => $item->name)
});
应该做到这一点。
答案 5 :(得分:1)
pluck()
仅用于为您选择一个值。不相关。
在单个集合上使用 only(['id','name'])
。而是一系列集合。
例如
$collection = collect(['id' => 1, 'name' => 'Taylor']);
$collection->only(['name']);
要通过一系列集合来做到这一点
$helloworld = collect([
['id' => 1, 'name' => 'Taylor'],
['id' => 2, 'name' => 'Some Guy'];
]);
使用地图
$helloworld->map(function($aSingleCollection){
return $aSingleCollection->only(['name']);
});
注意:
了解模型及其返回集合或查询构建器对象很重要。
集合方法将适用于扩展口才Illuminate\Database\Eloquent\Model
答案 6 :(得分:0)
pluck()辅助函数确实采用了第二个参数。然后它将返回一个关联数组,其中第二个参数定义键。因此,您将获得key => value
对的结果。
如您所知,您的参赛作品将包含ID和名称,这可能会有所帮助:
$lesson->users->pluck('name', 'id')->toArray();
这将返回:
[
10 => 'Michael Dook',
16 => 'Henry Babcock',
19 => 'Joe Nedd'
]
我不确定Laravel 5.2,但这适用于Laravel 5.5
答案 7 :(得分:0)
在Laravel 6中。^
收集方法->only()
仅返回集合中给定的ID。
在->get()
方法中,您可以指定要返回的列。
在集合上,可以使用方法->keyBy('id')
设置数组的键。
要返回以id为键的记录以及包含id和name的数组,请使用以下代码:
$lesson->users()->get(['id', 'name'])->keyBy('id')->toArray()