Eloquent列按键列出数组作为值?

eCo*_*Evo 41 php laravel eloquent laravel-4

所以我可以用Eloquent做到这一点:

$roles = DB::table('roles')->lists('title', 'name');
Run Code Online (Sandbox Code Playgroud)

但有没有办法让Eloquent获取每个不同键而不是一列的值数组?

例如,类似于以下内容:

$roles = DB::table('roles')->lists(['*', DB:raw('COALESCE(value, default_value)')], 'name');
Run Code Online (Sandbox Code Playgroud)

Jos*_*ber 85

您可以使用以下keyBy方法:

$roles = Role::all()->keyBy('name');
Run Code Online (Sandbox Code Playgroud)

如果您没有使用Eloquent,您可以自己创建一个集合:

$roles = collect(DB::table('roles')->get())->keyBy('name');
Run Code Online (Sandbox Code Playgroud)

如果您使用的是Laravel 5.3+,则查询构建器现在实际上会返回一个集合,因此无需再次手动将其包装在集合中:

$roles = DB::table('roles')->get()->keyBy('name');
Run Code Online (Sandbox Code Playgroud)

  • @eComEvo - [我个人实现](https://github.com/laravel/framework/pull/4828)只为你:) (7认同)

tom*_*rod 14

如果你需要一个key/value数组,因为Laravel 5.1你可以使用pluck.这样,您可以指定要用作a value和a的属性key.

$plucked = MyModel::all()->pluck('MyNameAttribute', 'MyIDAttribute');

return $plucked->all();
Run Code Online (Sandbox Code Playgroud)

您将得到如下数组:

array:3 [?
   1 => "My MyNameAttribute value"
   2 => "Lalalala"
   3 => "Oh!"
]
Run Code Online (Sandbox Code Playgroud)


The*_*pha 8

你可以尝试这样的事情:

$roles = array();
array_map(function($item) use (&$roles) {
    $roles[$item->id] = (Array)$item; // object to array
}, DB::table('roles')->get());
Run Code Online (Sandbox Code Playgroud)

如果你想获得一个Object而不是一个Array值,那么只需删除(Array).

替代方案:使用Eloquent模型(而不是DB::table):

$roles = array();
array_map(function($item) use (&$roles) {
    $roles[$item['id']] = $item;
}, Role::all()->toArray());
Run Code Online (Sandbox Code Playgroud)

另一种选择:使用Collection::map()方法:

$roles = array();
Role::all()->map(function($item) use(&$roles) {
    $roles[$item->id] = $item->toArray();
});
Run Code Online (Sandbox Code Playgroud)