Şimdi buna kendi çözümüm var:
1. Dizilerden belirli öznitelikleri çıkarmak için genel bir işlev oluşturuldu
Aşağıdaki işlev, bir ilişkilendirilebilir diziden veya ilişkilendirilebilir dizilerden yalnızca belirli öznitelikleri çıkarır (sonuncusu Laravel'de $ collection-> toArray () işlemi yaparken elde ettiğiniz şeydir).
Şu şekilde kullanılabilir:
$data = array_extract( $collection->toArray(), ['id','url'] );
Aşağıdaki işlevleri kullanıyorum:
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;
}
Bu çözüm, büyük veri kümelerinde koleksiyonlar arasında döngü oluşturmanın performans etkilerine odaklanmaz.
2. Yukarıdakileri özel bir koleksiyon yoluyla uygulayın i Laravel
Sadece yapabilmek istediğim için $collection->extract('id','url');Herhangi bir koleksiyon nesnesi üzerinde istediğim için, özel bir koleksiyon sınıfı uyguladım.
İlk olarak, Eloquent modelini genişleten, ancak farklı bir koleksiyon sınıfı kullanan genel bir Model oluşturdum. Tüm modellerin bu özel modeli genişletmesi gerekir, o zaman Eloquent Modeli değil.
<?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 );
}
}
?>
İkinci olarak, aşağıdaki özel koleksiyon sınıfını oluşturdum:
<?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 );
}
}
?>
Son olarak, tüm modeller bunun yerine özel modelinizi aşağıdaki gibi genişletmelidir:
<?php
namespace App\Models;
class Article extends Model
{
...
Şimdi hayır fonksiyonları. Yukarıdaki 1, $collection->extract()yöntemi kullanılabilir kılmak için koleksiyon tarafından özenle kullanılır .
Collection::implode(). Bir özelliği alıp koleksiyondaki tüm nesnelerden çıkarabilir. Bu, bu soruyu tam olarak yanıtlamaz, ancak benim yaptığım gibi Google'dan buraya gelen başkaları için faydalı olabilir. laravel.com/docs/5.7/collections#method-implode