如何从Laravel查询构建器获取一组2元组?

时间:2016-11-09 18:51:06

标签: 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 [
    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中不存在,但概念是一样的;每个条目都有固定的长度。

4 个答案:

答案 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的CollectionMacroable,因此您可以添加自己的功能来执行此操作。

例如,在您的代码中的某个位置(例如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();