Ahora he encontrado una solución propia para esto:
1. Creó una función general para extraer atributos específicos de matrices
La función a continuación extrae solo atributos específicos de una matriz asociativa o una matriz de matrices asociativas (la última es lo que obtiene al hacer $ collection-> toArray () en Laravel).
Se puede usar así:
$data = array_extract( $collection->toArray(), ['id','url'] );
Estoy usando las siguientes funciones:
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;
}
Esta solución no se centra en las implicaciones de rendimiento al recorrer las colecciones en grandes conjuntos de datos.
2. Implementar lo anterior a través de una colección personalizada en Laravel
Como me gustaría poder hacer simplemente $collection->extract('id','url');
en cualquier objeto de colección, he implementado una clase de colección personalizada.
Primero creé un modelo general, que extiende el modelo Eloquent, pero usa una clase de colección diferente. Todos sus modelos necesitan ampliar este modelo personalizado, y no el modelo 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 );
}
}
?>
En segundo lugar, creé la siguiente clase de colección personalizada:
<?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 );
}
}
?>
Por último, todos los modelos deberían extender su modelo personalizado en su lugar, como tal:
<?php
namespace App\Models;
class Article extends Model
{
...
Ahora las funciones del no. 1 de arriba son utilizados cuidadosamente por la colección para que el $collection->extract()
método esté disponible.
Collection::implode()
. Puede tomar una propiedad y extraerla de todos los objetos de la colección. Esto no responde exactamente a esta pregunta, pero podría ser útil para otros que han venido aquí desde Google, como lo hice yo. laravel.com/docs/5.7/collections#method-implode