Ich habe jetzt eine eigene Lösung dafür gefunden:
1. Erstellt eine allgemeine Funktion zum Extrahieren bestimmter Attribute aus Arrays
Die folgende Funktion extrahiert nur bestimmte Attribute aus einem assoziativen Array oder einem Array von assoziativen Arrays (das letzte erhalten Sie, wenn Sie $ collection-> toArray () in Laravel ausführen).
Es kann folgendermaßen verwendet werden:
$data = array_extract( $collection->toArray(), ['id','url'] );
Ich benutze folgende Funktionen:
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;
}
Diese Lösung konzentriert sich nicht auf die Auswirkungen auf die Leistung beim Durchlaufen der Sammlungen in großen Datenmengen.
2. Implementieren Sie das Obige über eine benutzerdefinierte Sammlung in Laravel
Da ich einfach $collection->extract('id','url');
auf jedes Sammlungsobjekt zugreifen möchte , habe ich eine benutzerdefinierte Sammlungsklasse implementiert.
Zuerst habe ich ein allgemeines Modell erstellt, das das Eloquent-Modell erweitert, aber eine andere Auflistungsklasse verwendet. Alle Ihre Modelle müssen dieses benutzerdefinierte Modell erweitern und nicht das eloquente Modell.
<?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 );
}
}
?>
Zweitens habe ich die folgende benutzerdefinierte Sammlungsklasse erstellt:
<?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 );
}
}
?>
Schließlich sollten alle Modelle stattdessen Ihr benutzerdefiniertes Modell wie folgt erweitern:
<?php
namespace App\Models;
class Article extends Model
{
...
Nun sind die Funktionen von Nr. 1 oben werden von der Sammlung ordentlich verwendet, um die $collection->extract()
Methode verfügbar zu machen .
Collection::implode()
. Es kann eine Eigenschaft nehmen und aus allen Objekten in der Sammlung extrahieren. Dies beantwortet diese Frage nicht genau, kann aber für andere nützlich sein, die wie ich von Google hierher gekommen sind. laravel.com/docs/5.7/collections#method-implode