2016-11-09 106 views
1

基本上,我想這樣做:如何從Laravel查詢構建器獲取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中存在,但概念是相同的;每個條目都有一個固定的長度。

回答

1

開箱即用沒有這個功能,但Laravel的CollectionMacroable,所以你可以添加你自己的功能來做到這一點。

例如,某個在你的代碼(如您AppServiceProviderboot()方法),您可以添加新的方法到Collection

// add toIndexedArray method to collections 
\Illuminate\Support\Collection::macro('toIndexedArray', function() { 
    return array_map('array_values', $this->toArray()); 
}); 

現在你可以使用這個新的方法,像任何其他正常Collection方法中,因此最終的代碼將是:

從文檔
$locals['companies'] = Company::orderBy('name')->get(['id','name'])->toIndexedArray(); 
+0

哦,整潔!我不知道你可以擴展'Collection'。 – mpen

0

使用pluck()

$locals['companies'] = Company::orderBy('name')->pluck('id', 'name')->toArray(); 

如果您需要Form::select列表這將工作:

$locals['companies'] = Company::orderBy('name')->pluck('name', 'id'); 
+0

右,返回:'[ '督促-100'=> '桌子', 'PROD-200'=> '椅']'。我想*數字*指數。即答案應該是'[''prod-100','Desk'],['prod-200','Chair']]'。 – mpen

+1

我猜'map()'是最好的解決方案。 –

0

可以省略地圖功能,只是做:

$locals['companies'] = Company::orderBy('name')->get(['id','name'])->toArray(); 
+0

錯誤的輸出格式。 – mpen

1

如果這是你需要的東西,你可以在config/database.php中改變PDO獲取模式到PDO::FETCH_NUM。我假設它也可以在運行中進行更改,但代碼可能看起來不太好。恐怕我不認爲有一個Laravel命令可以爲單個查詢進行更改。否則,由於該數組是多維的,因此恐怕您確實需要以某種方式映射它們,並且Laravel集合不能很好地與例如->map('array_values')這本來會更清潔。

你可以將它包裝在array_map('array_values', $array)但這似乎很愚蠢。

如果您將->map()更改爲->transform(),那麼至少您可以縮短一點 - 那麼您最後不需要使用->toArray()

+0

我所有的下拉菜單都使用這種格式,所以我需要它很多。我想我會使用自定義函數的變換。謝謝! – mpen