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 для этой цели.

Author: Jazerix, 2016-02-08

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

 4
Author: Kaspars, 2016-06-30 05:16:42

В коллекциях 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'];

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

 3
Author: Tim Selaty Jr., 2016-02-08 13:43:59

Использовать pluck():

$feature_project = FeatureProject::where('project_id', $project->id)->pluck('feature_id');
 1
Author: Ralph John Galindo, 2016-02-09 06:47:04

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

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

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

 0
Author: Ali, 2016-02-09 06:34:09

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

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

Надеюсь, это поможет.

 0
Author: Zakaria Acharki, 2016-02-09 19:06:01