Laravel 5.2 - Изменение формата данных, полученное от Eloquent
У меня есть такая модель -
$feature_project = FeatureProject::select('feature_id')
->where('project_id', $project->id)
->get();
И если я верну его, я получу такой вывод -
[
{
"feature_id": 2
},
{
"feature_id": 4
},
{
"feature_id": 9
}
]
Но я хочу, чтобы вывод был таким -
[2,4,9]
Поэтому мне нужно преобразовать выходные данные.
Но я не нахожу способа без использования цикла для каждого (создайте временный массив, переместите все элементы в этот массив из текущего массива с циклом для каждого).
Но я думаю, что в Laravel есть более разумный способ сделать это.
Я думаю, что используется коллекция Laravel для этой цели.
5 answers
Вы можете вызвать метод 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
В качестве альтернативы вы можете использовать функцию PHP array_column()
для необработанных массивов.
http://php.net/manual/en/function .array-column.php
В коллекциях 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'];
При довольно плоском объекте он должен возвращать только значения.
Использовать pluck()
:
$feature_project = FeatureProject::where('project_id', $project->id)->pluck('feature_id');
Альтернативный способ также будет полезен в некоторых случаях.
Мы можем запускать запросы raw
внутри функции select
.
Вот пример:
$feature_project = FeatureProject::select(DB::raw('GROUP_CONCAT("feature_id")))
->where('project_id', $project->id)
->get();
В DB::raw
мы можем запустить запрос mysql с функцией и регистром, таким же, как запрос mysql.
Вы можете использовать lists()
и toArray()
:
$feature_project=FeatureProject::where('project_id', $project->id)->lists('id')->toArray();
Надеюсь, это поможет.