Подтвердить что ты не робот

Как создать новую пустую Eloquent Collection в Laravel 4

Как мы создаем новую коллекцию Eloquent в Laravel 4 без использования Query Builder?

Существует метод newCollection(), который может быть переопределен тем, что на самом деле не выполняет работу, потому что это используется только при запросе результата набора.

Я подумывал создать пустую коллекцию, а затем заполнить ее черными объектами. Причина, по которой я не использую массив, - это то, что мне нравятся методы "Красноречивые коллекции", такие как contains.

Если есть другие альтернативы, я хотел бы услышать их.

4b9b3361

Ответ 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