2016-02-08 18 views
6

Ho un modello come questo-laravel 5.2 - Cambio Formato dati ottenere da Eloquente

$feature_project = FeatureProject::select('feature_id') 
         ->where('project_id', $project->id) 
         ->get(); 

E se torno, io sto ottenendo un output come questo-

[ 
    { 
    "feature_id": 2 
    }, 
    { 
    "feature_id": 4 
    }, 
    { 
    "feature_id": 9 
    } 
] 

Ma voglio t output come this-

[2,4,9] 

Quindi ho bisogno di convertire l'uscita.

Ma non trovo un modo senza utilizzare per ogni ciclo (creare un array temporaneo, spingere tutti gli elementi su quell'array dall'array corrente con un ciclo for-each).

Ma penso che a Laravel ci sia un modo più intelligente di farlo.

Penso che la Collezione Laravel sia utilizzata per questo scopo.

+0

Hai provato PHP json_decode()? Penso che dovrebbe convertire questo '[{" feature_id ": 2}, {" feature_id ": 4}, {" feature_id ": 9}]' a questo '[2,4,9]' – Michel

+0

@Michel Eloquent restituisce un collezione. È codificato per JSON solo nella risposta. – Kaspars

risposta

4

È possibile chiamare il metodo pluck() nel generatore di query.

$feature_project = FeatureProject::select('feature_id') 
             ->where('project_id', $project->id) 
             ->pluck('feature_id'); // [2,4,9] 

https://laravel.com/api/5.2/Illuminate/Database/Eloquent/Builder.html#method_lists

In alternativa, è possibile utilizzare la funzione di PHP array_column() per gli array prime. http://php.net/manual/en/function.array-column.php

+0

-> pluck ('feature_id'); è meglio di qualsiasi altra opzione per questo, ma anche le liste sono una buona risposta. Ma liste() saranno private di laravel 5.3, quindi cogli la migliore risposta –

+0

@AbrarJahin Grazie per le informazioni, ho modificato la mia risposta. – Kaspars

0

In alcuni casi è utile anche un modo alternativo. Possiamo eseguire query raw all'interno della funzione select. Ecco un esempio:

$feature_project = FeatureProject::select(DB::raw('GROUP_CONCAT("feature_id"))) 
        ->where('project_id', $project->id) 
        ->get(); 

In DB::raw possiamo eseguire mysql query con funzione e custodia stessa interrogazione mysql.

+0

Mi spiace dirlo, è la risposta sbagliata –

+0

Posso sapere perché è sbagliato? Sto già usando questo tipo di query. – Ali

3

Nelle raccolte di Laravel, è possibile chiamare un metodo denominato Flatten, che appiattisce una raccolta multidimensionale in una singola dimensione.

https://laravel.com/docs/5.2/collections#method-flatten

$collection = collect(['name' => 'taylor', 'languages' => ['php', 'javascript']]); 

$flattened = $collection->flatten(); 

$flattened->all(); 

// ['taylor', 'php', 'javascript']; 

Con un oggetto piuttosto piatta, deve restituire solo i valori.

+0

Grazie, è anche una buona alternativa. Quindi lo sto svalutando –

1

Uso pluck():

$feature_project = FeatureProject::where('project_id', $project->id)->pluck('feature_id'); 
0

È possibile utilizzare lists() e toArray():

$feature_project=FeatureProject::where('project_id', $project->id)->lists('id')->toArray(); 

Spero che questo aiuti.