Зараз я придумав власне рішення цього:
1. Створено загальну функцію для вилучення конкретних атрибутів із масивів
Функція нижче витягує лише конкретні атрибути з асоціативного масиву або масиву асоціативних масивів (останнє - це те, що ви отримуєте, виконуючи $ collection-> toArray () у Laravel).
Його можна використовувати так:
$data = array_extract( $collection->toArray(), ['id','url'] );
Я використовую такі функції:
function array_is_assoc( $array )
{
return is_array( $array ) && array_diff_key( $array, array_keys(array_keys($array)) );
}
function array_extract( $array, $attributes )
{
$data = [];
if ( array_is_assoc( $array ) )
{
foreach ( $attributes as $attribute )
{
$data[ $attribute ] = $array[ $attribute ];
}
}
else
{
foreach ( $array as $key => $values )
{
$data[ $key ] = [];
foreach ( $attributes as $attribute )
{
$data[ $key ][ $attribute ] = $values[ $attribute ];
}
}
}
return $data;
}
Це рішення не фокусується на наслідках продуктивності циклічного перегляду колекцій у великих наборах даних.
2. Реалізуйте вищезазначене за допомогою спеціальної колекції i Laravel
Оскільки я хотів би мати можливість просто робити $collection->extract('id','url');
будь-який об’єкт колекції, я реалізував власний клас колекції.
Спочатку я створив загальну модель, яка розширює модель Eloquent, але використовує інший клас колекції. Усі ваші моделі повинні розширити цю спеціальну модель, а не красномовну модель.
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model as EloquentModel;
use Lib\Collection;
class Model extends EloquentModel
{
public function newCollection(array $models = [])
{
return new Collection( $models );
}
}
?>
По-друге, я створив такий власний клас колекції:
<?php
namespace Lib;
use Illuminate\Support\Collection as EloquentCollection;
class Collection extends EloquentCollection
{
public function extract()
{
$attributes = func_get_args();
return array_extract( $this->toArray(), $attributes );
}
}
?>
Нарешті, усі моделі повинні замість цього розширити власну модель, наприклад:
<?php
namespace App\Models;
class Article extends Model
{
...
Тепер функції з №. 1 вище, акуратно використовується колекцією, щоб зробити $collection->extract()
метод доступним.
Collection::implode()
. Він може взяти властивість і витягти його з усіх об’єктів у колекції. Це не дає точного відповіді на це запитання, але може бути корисним для інших, хто прийшов сюди з Google, як я це зробив. laravel.com/docs/5.7/collections#method-implode