Mam teraz własne rozwiązanie tego problemu:
1. Utworzono ogólną funkcję wyodrębniania określonych atrybutów z tablic
Poniższa funkcja wyodrębnia tylko określone atrybuty z tablicy asocjacyjnej lub tablicy tablic asocjacyjnych (ostatnia jest tym, co otrzymujesz wykonując $ collection-> toArray () w Laravel).
Można go używać w następujący sposób:
$data = array_extract( $collection->toArray(), ['id','url'] );
Używam następujących funkcji:
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;
}
To rozwiązanie nie koncentruje się na wpływie na wydajność podczas przeglądania kolekcji w dużych zestawach danych.
2. Zaimplementuj powyższe poprzez niestandardową kolekcję w Laravel
Ponieważ chciałbym móc po prostu to zrobić $collection->extract('id','url');
na dowolnym obiekcie kolekcji, zaimplementowałem niestandardową klasę kolekcji.
Najpierw stworzyłem ogólny Model, który rozszerza model Eloquent, ale używa innej klasy kolekcji. Wszystkie modele, których potrzebujesz, aby rozszerzyć ten niestandardowy model, a nie model elokwentny wtedy.
<?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 );
}
}
?>
Po drugie stworzyłem następującą klasę kolekcji niestandardowej:
<?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 );
}
}
?>
Na koniec wszystkie modele powinny zamiast tego rozszerzyć model niestandardowy, na przykład:
<?php
namespace App\Models;
class Article extends Model
{
...
Teraz funkcje z nr. 1 powyżej są starannie używane przez kolekcję, aby udostępnić $collection->extract()
metodę.
Collection::implode()
. Może pobrać właściwość i wyodrębnić ją ze wszystkich obiektów w kolekcji. To nie odpowiada dokładnie na to pytanie, ale może być przydatne dla innych, którzy przyszli tu z Google, tak jak ja. laravel.com/docs/5.7/collections#method-implode