仅从Laravel Collection获取特定属性

pre*_*eyz 58 php laravel

我一直在审查Laravel Collections的文档和API,但似乎找不到我要找的东西:

我想从集合中检索包含模型数据的数组,但只获取指定的属性.

也就是说Users::toArray('id','name','email'),集合实际上拥有用户的所有属性,因为它们在别处使用,但在这个特定的地方我需要一个带有userdata的数组,并且只需要指定的属性.

在Laravel中似乎没有帮助吗? - 我怎样才能以最简单的方式做到这一点?

pat*_*cus 125

您可以使用现有Collection方法的组合来完成此操作.一开始可能有点难以理解,但它应该很容易打破.

// get your main collection with all the attributes...
$users = Users::get();

// build your second collection with a subset of attributes. this new
// collection will be a collection of plain arrays, not Users models.
$subset = $users->map(function ($user) {
    return collect($user->toArray())
        ->only(['id', 'name', 'email'])
        ->all();
});
Run Code Online (Sandbox Code Playgroud)

说明

首先,该map()方法基本上只是迭代遍历Collection,并将每个项目Collection传递给传入的回调.从每次回调调用返回的值构建Collectionmap()方法生成的新值.

collect($user->toArray())只是建立一个新的,临时CollectionUsers属性.

->only(['id', 'name', 'email'])将临时Collection减少到仅指定的那些属性.

->all()将临时数Collection转回普通数组.

把它们放在一起就可以得到"对于users集合中的每个用户,返回一个只包含id,name和email属性的数组."


Laravel 5.5更新

Laravel 5.5 only在Model上添加了一个方法,它基本上和它一样collect($user->toArray())->only([...])->all(),所以这可以在5.5+中略微简化为:

// get your main collection with all the attributes...
$users = Users::get();

// build your second collection with a subset of attributes. this new
// collection will be a collection of plain arrays, not Users models.
$subset = $users->map(function ($user) {
    return $user->only(['id', 'name', 'email']);
});
Run Code Online (Sandbox Code Playgroud)

  • 在 Laravel 的最新版本中,这可以写得更简洁:`$users->map->only(['column', ...])` (2认同)

Ruf*_*les 15

use User::get(['id', 'name', 'email']),它将返回一个带有指定列的集合,如果你想使它成为一个数组,只需toArray()get()方法之后使用,如下所示:

User::get(['id', 'name', 'email'])->toArray()

大多数情况下,您不需要将集合转换为数组,因为集合实际上是类固醇上的数组,并且您可以使用易于使用的方法来操作集合.


haw*_*awx 7

下面的方法也有效。

$users = User::all()->map(function ($user) {
  return collect($user)->only(['id', 'name', 'email']);
});
Run Code Online (Sandbox Code Playgroud)