基本上,我想这样做:
$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中不存在,但概念是一样的;每个条目都有固定的长度。
答案 0 :(得分:1)
如果您需要很多东西,可以将config / database.php中的PDO获取模式更改为PDO::FETCH_NUM
。我假设它也可以即时更改它,但代码可能不会看起来那么棒。我不认为有一个Laravel命令可以针对单个查询更改它,我很害怕。
否则,由于阵列是多维的,我担心你确实需要以某种方式映射它们,并且Laravel集合不能很好地用于例如->map('array_values')
本来会更清洁。
你可以将它包装在array_map('array_values', $array)
中,但这看起来很愚蠢。
如果您将->map()
更改为->transform()
,至少可以缩短一点时间 - 然后您不需要在->toArray()
结束时使用它。
答案 1 :(得分:1)
没有开箱即用的功能,但Laravel的Collection
为Macroable
,因此您可以添加自己的功能来执行此操作。
例如,在您的代码中的某个位置(例如boot()
的{{1}}方法),您可以向AppServiceProvider
添加新方法:
Collection
现在您可以像使用任何其他普通// add toIndexedArray method to collections
\Illuminate\Support\Collection::macro('toIndexedArray', function() {
return array_map('array_values', $this->toArray());
});
方法一样使用此新方法,因此您的最终代码将为:
Collection
答案 2 :(得分:0)
使用pluck()
:
$locals['companies'] = Company::orderBy('name')->pluck('id', 'name')->toArray();
如果您需要Form::select
的列表,这将有效:
$locals['companies'] = Company::orderBy('name')->pluck('name', 'id');
答案 3 :(得分:0)
您可以省略地图功能,只需执行以下操作:
$locals['companies'] = Company::orderBy('name')->get(['id','name'])->toArray();