Теперь я придумал собственное решение этой проблемы:
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. Реализуйте вышесказанное с помощью специальной коллекции в Laravel.
Поскольку я хотел бы иметь возможность просто работать $collection->extract('id','url');с любым объектом коллекции, я реализовал собственный класс коллекции.
Сначала я создал общую модель, которая расширяет модель Eloquent, но использует другой класс коллекции. Все ваши модели должны расширять эту пользовательскую модель, а не модель 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