2016-02-08 1 views
6

У меня есть модель, как this-Laravel 5,2 - Изменение формата данных получают из красноречивых

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

И если я вернуть его, я получаю выход как this-

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

Но я хочу t, например,

[2,4,9] 

Так что мне нужно преобразовать выходной сигнал.

Но я не нахожу способ без использования цикла for-each (создайте временный массив, вытащите все элементы в этот массив из текущего массива с циклом for-each).

Но я думаю, что в Laravel есть более умный способ сделать это.

Я думаю, что для этого используется коллекция Laravel.

+0

Вы пробовали PHP json_decode()? Я думаю, что это должно преобразовать этот '[{" feature_id ": 2}, {" feature_id ": 4}, {" feature_id ": 9}]' к этому '[2,4,9]' – Michel

+0

@Michel Eloquent возвращает коллекция. Он кодируется json только в ответе. – Kaspars

ответ

4

Вы можете вызвать метод pluck() в построителе запросов.

$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

В качестве альтернативы, вы можете использовать array_column() функцию PHP для исходных массивов. http://php.net/manual/en/function.array-column.php

+0

-> pluck ('feature_id'); лучше, чем любой другой вариант для этого, но списки также являются хорошим ответом. Но списки() будут лишены из laravel 5.3, поэтому лучше всего ответить –

+0

@AbrarJahin Спасибо за информацию, я отредактировал свой ответ. – Kaspars

0

Альтернативный способ также будет полезен в некоторых случаях. Мы можем запустить raw запросов внутри select функция. Вот пример:

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

В DB::raw мы можем запустить MySQL запрос с функцией и при этом, как MySQL Query.

+0

Извините, что это неправильный ответ –

+0

Могу я узнать, почему это неправильно? Я уже использую этот тип запросов. – Ali

3

В коллекциях Laravel вы можете вызвать метод Flatten, который сглаживает многомерную коллекцию в одно измерение.

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

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

$flattened = $collection->flatten(); 

$flattened->all(); 

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

С довольно плоским объектом, он должен возвращать только значение.

+0

Спасибо, Это хорошая альтернатива. Поэтому я поддерживаю его –

1

Использование pluck():

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

Вы можете использовать lists() и toArray():

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

Надеется, что это помогает.