如何从Laravel查询生成器获取2元组数组?
基本上,我想这样做:如何从Laravel查询生成器获取2元组数组?,laravel,laravel-5,laravel-5.2,Laravel,Laravel 5,Laravel 5.2,基本上,我想这样做: $locals['companies'] = Company::orderBy('name')->get(['id','name'])->map(function($c) { return [$c->id, $c->name]; })->toArray(); 但是没有这样一个冗长的map函数。难道没有一个类似get的方法可以返回平面数字数组而不是对象吗 为了清楚起见,输出应该如下所示: array:4 [ 0 => array:2
$locals['companies'] = Company::orderBy('name')->get(['id','name'])->map(function($c) { return [$c->id, $c->name]; })->toArray();
但是没有这样一个冗长的map
函数。难道没有一个类似get的方法可以返回平面数字数组而不是对象吗
为了清楚起见,输出应该如下所示:
array:4 [
0 => array:2 [
0 => 4
1 => "My Company"
]
1 => array:2 [
0 => 14
1 => "Example Company"
]
2 => array:2 [
0 => 13
1 => "Best Company"
]
3 => array:2 [
0 => 12
1 => "Super Co"
]
]
这就是我所说的2元组:两个元素的数字数组。我知道它们在PHP中不存在,但概念是一样的;每个条目都有固定的长度。使用:
如果您需要Form::select
的列表,这将起作用:
$locals['companies'] = Company::orderBy('name')->pluck('name', 'id');
您可以省略map函数,只需执行以下操作:
$locals['companies'] = Company::orderBy('name')->get(['id','name'])->toArray();
如果这是您非常需要的,您可以将config/database.php中的PDO fetch模式更改为
PDO::fetch_NUM
。我假设也可以动态更改它,但是代码看起来可能不会那么好。恐怕没有一个Laravel命令可以为一个查询更改它
否则,由于数组是多维的,我担心您确实需要以某种方式映射到它们,而Laravel集合不能很好地与例如->map('array_values')
一起工作,后者会更干净
您可以将其包装在array\u映射('array\u values',$array)
中,但这似乎很愚蠢
如果您将
->map()
更改为->transform()
,那么您至少可以将其缩短一点,这样您就不需要在最后添加->toArray()
。没有现成的函数来执行此操作,但Laravel的集合是可宏操作的,因此,您可以向其添加自己的函数来完成此操作
例如,在代码中的某个地方(如AppServiceProvider
的boot()
方法),可以向集合添加新方法:
// add toIndexedArray method to collections
\Illuminate\Support\Collection::macro('toIndexedArray', function() {
return array_map('array_values', $this->toArray());
});
现在,您可以像使用任何其他普通的收集方法一样使用此新方法,因此您的最终代码将是:
$locals['companies'] = Company::orderBy('name')->get(['id','name'])->toIndexedArray();
直接从文档返回:['prod-100'=>'桌面','prod-200'=>'椅子]
。我想要数字索引。i、 例如,答案应该是[['prod-100','Desk'],['prod-200','Chair']]
。我想map()
是最好的解决方案。我所有的下拉列表都使用这种格式,所以我会非常需要它。我想我将使用带有自定义函数的transform。谢谢哦,太好了!我不知道你可以扩展Collection
s。
$locals['companies'] = Company::orderBy('name')->get(['id','name'])->toIndexedArray();