Sono giunto con una propria soluzione a questo:
1. Creazione di una funzione generale per estrarre gli attributi specifici da matrici
La funzione qui sotto estratto unici attributi specifici da un array associativo, o una serie di array associativi (l'ultimo è ciò che ottieni quando fai $ collection-> toArray() in Laravel).
Esso può essere utilizzato in questo modo:
$data = array_extract($collection->toArray(), ['id','url']);
Sto usando le seguenti funzioni:
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;
}
Questa soluzione non si concentra sulle implicazioni di prestazioni in loop attraverso le collezioni di grandi set di dati.
2. la realizzazione degli scenari tramite una raccolta personalizzata i laravel
Dal momento mi piacerebbe essere in grado di fare semplicemente $collection->extract('id','url');
su qualsiasi oggetto di raccolta, ho implementato una classe insieme personalizzato.
Prima ho creato un modello generale, che estende il modello Eloquent, ma utilizza una classe di raccolta diversa. Tutti i modelli devono estendere questo modello personalizzato e non il modello 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);
}
}
?>
In secondo luogo ho creato la seguente classe di insieme personalizzata:
<?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);
}
}
?>
Infine, tutti i modelli dovrebbero quindi estendere il proprio modello personalizzato invece, come ad esempio:
<?php
namespace App\Models;
class Article extends Model
{
...
Ora le funzioni da non . 1 qui sopra sono ordinatamente utilizzati dalla collezione per rendere disponibile il metodo $collection->extract()
.
Grazie! Ho contrassegnato questo come la risposta accettata, perché funziona come un fascino con funzionalità Laravel esistenti. - Ora, questo potrebbe essere reso disponibile alla collezione tramite una classe di raccolta personalizzata, come ho descritto nella mia soluzione alternativa. – preyz