所以我可以用Eloquent做到这一点:
$roles = DB::table('roles')->lists('title', 'name');
但是有没有办法让Eloquent为每个不同的键而不是只有一列获取值数组?
例如,如下所示:
$roles = DB::table('roles')->lists(['*', DB:raw('COALESCE(value, default_value)')], 'name');
答案 0 :(得分:79)
您可以使用keyBy
方法:
$roles = Role::all()->keyBy('name');
如果你没有使用Eloquent,你可以自己创建一个集合:
$roles = collect(DB::table('roles')->get())->keyBy('name');
如果您使用的是Laravel 5.3+,查询构建器现在实际上会返回一个集合,因此无需再次手动将其包装在集合中:
$roles = DB::table('roles')->get()->keyBy('name');
答案 1 :(得分:11)
如果您需要key/value
数组,那么从Laravel 5.1
起,您可以使用pluck
。这样,您可以指定要将哪些属性用作value
和key
。
$plucked = MyModel::all()->pluck('MyNameAttribute', 'MyIDAttribute');
return $plucked->all();
您将获得如下数组:
array:3 [▼
1 => "My MyNameAttribute value"
2 => "Lalalala"
3 => "Oh!"
]
答案 2 :(得分:7)
您可以尝试这样的事情:
$roles = array();
array_map(function($item) use (&$roles) {
$roles[$item->id] = (Array)$item; // object to array
}, DB::table('roles')->get());
如果您希望获得Object
而不是Array
作为值,则只需删除(Array)
即可。
替代方案:使用Eloquent
模型(而不是DB::table
):
$roles = array();
array_map(function($item) use (&$roles) {
$roles[$item['id']] = $item;
}, Role::all()->toArray());
另一种选择:使用Collection::map()
方法:
$roles = array();
Role::all()->map(function($item) use(&$roles) {
$roles[$item->id] = $item->toArray();
});