暂存
This commit is contained in:
@@ -0,0 +1,58 @@
|
||||
<?php
|
||||
|
||||
namespace Illuminate\Database\Eloquent;
|
||||
|
||||
use Illuminate\Database\Eloquent\Attributes\CollectedBy;
|
||||
use ReflectionClass;
|
||||
|
||||
/**
|
||||
* @template TCollection of \Illuminate\Database\Eloquent\Collection
|
||||
*/
|
||||
trait HasCollection
|
||||
{
|
||||
/**
|
||||
* The resolved collection class names by model.
|
||||
*
|
||||
* @var array<class-string<static>, class-string<TCollection>>
|
||||
*/
|
||||
protected static array $resolvedCollectionClasses = [];
|
||||
|
||||
/**
|
||||
* Create a new Eloquent Collection instance.
|
||||
*
|
||||
* @param array<array-key, \Illuminate\Database\Eloquent\Model> $models
|
||||
* @return TCollection
|
||||
*/
|
||||
public function newCollection(array $models = [])
|
||||
{
|
||||
static::$resolvedCollectionClasses[static::class] ??= ($this->resolveCollectionFromAttribute() ?? static::$collectionClass);
|
||||
|
||||
$collection = new static::$resolvedCollectionClasses[static::class]($models);
|
||||
|
||||
if (Model::isAutomaticallyEagerLoadingRelationships()) {
|
||||
$collection->withRelationshipAutoloading();
|
||||
}
|
||||
|
||||
return $collection;
|
||||
}
|
||||
|
||||
/**
|
||||
* Resolve the collection class name from the CollectedBy attribute.
|
||||
*
|
||||
* @return class-string<TCollection>|null
|
||||
*/
|
||||
public function resolveCollectionFromAttribute()
|
||||
{
|
||||
$reflection = new ReflectionClass(static::class);
|
||||
|
||||
do {
|
||||
$attributes = $reflection->getAttributes(CollectedBy::class);
|
||||
|
||||
if (isset($attributes[0], $attributes[0]->getArguments()[0])) {
|
||||
return $attributes[0]->getArguments()[0];
|
||||
}
|
||||
} while ($reflection = $reflection->getParentClass());
|
||||
|
||||
return null;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user