如何从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();