Laravel 5.2采用Eloquent Model Collection中的多个属性

Fus*_*ion 18 helpers laravel-collection laravel-5.2

Laravel 5.2有很好的助手,我想用它们做以下事情:

我有Eloquent模型集合:

$lesson->users(); // returns Eloquent collection of 3 users
Run Code Online (Sandbox Code Playgroud)

pluck()函数会很有用,但它只能得到单个参数.但是我希望得到两个参数的输出,id并且name像这样:

[
1=>['id'=>10,'name'=>'Michael Dook'],
2=>['id'=>16,'name'=>'Henry Babcock'],
3=>['id'=>19,'name'=>'Joe Nedd']
]
Run Code Online (Sandbox Code Playgroud)

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

Bla*_*ake 28

我知道这不是最近的问题,但如果以后有人从谷歌上绊倒它,请参阅唯一收集方法

$lesson->users()->only("id", "name")->toArray(); 应该是你想要的.

  • 这不是*问题的解决方案.首先调用方法`users()`不*返回任何类型的集合而是QueryBuilder对象,你必须使用魔术属性` - > user`.这也是造成@Paul问题的原因.其次,`only()`集合方法*不*与`pluck()`相同.`only()`返回存储在给定键之一下的基础集合的所有元素.另一方面,`pluck()`试图找到每个集合项中的给定键*并返回它. (7认同)
  • 在 Laravel 5.2 中,当调用 `users()` 时,这会导致 `Call to undefined method Illuminate\Database\Query\Builder::only()` 错误,或者为 `users` 提供空集合(不带大括号) (2认同)

fay*_*ayz 13

Laravel:5.7

如果方法正在返回关系

get()

例如

$lesson = Lesson::find(1);
$lesson->users()->get(['id', 'name']);
Run Code Online (Sandbox Code Playgroud)

关于收藏

only()

$user = collect(['id' => 1, 'name' => 'Foo', 'role' => 'A']);
$user->only(['id', 'name']);
Run Code Online (Sandbox Code Playgroud)

多个阵列

$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);
Run Code Online (Sandbox Code Playgroud)


Abh*_*hek 7

试试这个:

$lesson->users()->select('id', 'name')->get()->toArray();
Run Code Online (Sandbox Code Playgroud)


ego*_*ego 6

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

$settings = \App\Setting::all()->map(function ($setting) {
    return ['key' => $setting->name, 'value' => $setting];
})->pluck('value', 'key')->toArray();
Run Code Online (Sandbox Code Playgroud)


hac*_*kel 6

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

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

$lesson->users()->map->only('id', 'name');
Run Code Online (Sandbox Code Playgroud)

如果用户是普通数组,您可以使用:

$lesson->users()->map(fn ($user) => Arr::only($user, ['id', 'name']));
Run Code Online (Sandbox Code Playgroud)


Mar*_*ark 5

$result = $lesson->users()->map(function($item){ 
  return array('id' => $item->id, 'name' => $item->name)
});
Run Code Online (Sandbox Code Playgroud)

应该做到这一点。