Как создать новую пустую Eloquent Collection в Laravel 4
Как мы создаем новую коллекцию Eloquent в Laravel 4 без использования Query Builder?
Существует метод newCollection()
, который может быть переопределен тем, что на самом деле не выполняет работу, потому что это используется только при запросе результата набора.
Я подумывал создать пустую коллекцию, а затем заполнить ее черными объектами. Причина, по которой я не использую массив, - это то, что мне нравятся методы "Красноречивые коллекции", такие как contains
.
Если есть другие альтернативы, я хотел бы услышать их.
Ответы
Ответ 1
Это не очень Красноважно, чтобы добавить в свою коллекцию модель Eloquent, у вас есть несколько вариантов:
В Laravel 5 вы можете воспользоваться помощником
$c = collect(new Post);
или
$c = collect();
$c->add(new Post);
OLD Laravel 4 ANSWER
$c = new \Illuminate\Database\Eloquent\Collection;
И тогда вы можете
$c->add(new Post);
Или вы можете использовать make:
$c = Collection::make(new Post);
Ответ 2
Начиная с Laravel 5. Я использую глобальную функцию collect()
$collection = collect([]); // initialize an empty array [] inside to start empty collection
этот синтаксис очень чистый, и вы также можете добавить смещения, если вам не нужен числовой индекс, например:
$collection->offsetSet('foo', $foo_data); // similar to add function but with
$collection->offsetSet('bar', $bar_data); // an assigned index
Ответ 3
Чтобы добавить к принятому ответу, вы также можете создать псевдоним в config/app.php
'aliases' => array(
...
'Collection' => Illuminate\Database\Eloquent\Collection::class,
Тогда вам просто нужно сделать
$c = new Collection;
Ответ 4
Я на самом деле обнаружил, что использование newCollection()
является более перспективным....
Пример:
$collection = (new Post)->newCollection();
Таким образом, если вы решите создать свой собственный класс коллекции для вашей модели (как я это делал несколько раз) на более позднем этапе, вам будет намного проще реорганизовать ваш код, поскольку вы просто переопределяете newCollection()
в вашей модели
Ответ 5
Laravel> = 5.5
Возможно, это не связано с первоначальным вопросом, но, поскольку это одна из первых ссылок в поиске Google, я считаю это полезным для тех, кто, как я, ищет способы создания пустой коллекции.
Если вы хотите вручную создать новую пустую коллекцию, вы можете использовать вспомогательный метод collect
подобный этому:
$new_empty_collection = collect();
Вы можете найти этот помощник в Illuminate\Support\helpers.php
фрагмент кода:
if (! function_exists('collect')) {
/**
* Create a collection from the given value.
*
* @param mixed $value
* @return \Illuminate\Support\Collection
*/
function collect($value = null)
{
return new Collection($value);
}
}
Ответ 6
Лучше использовать шаблон инжекции и после $this->collection->make([])
, чем new Collection
use Illuminate\Support\Collection;
...
// Inside of a clase.
...
public function __construct(Collection $collection){
$this->collection = $collection;
}
public function getResults(){
...
$results = $this->collection->make([]);
...
}
Ответ 7
В Laravel 5 и Laravel 6 вы можете разрешить класс Illuminate\Database\Eloquent\Collection
из сервисного контейнера, а затем добавить в него модели.
$eloquentCollection = resolve(Illuminate\Database\Eloquent\Collection::class);
// or app(Illuminate\Support\Collection::class). Whatever you prefer, app() and resolve() do the same thing.
$eloquentCollection->push(User::first());
Для получения дополнительной информации о понимании разрешения объектов из сервисного контейнера в laravel посмотрите здесь:https://laravel.com/docs/5.7/container#resolving