How to manually create a new empty Eloquent Collection in Laravel 4

烂漫一生 提交于 2019-12-03 17:58:07

问题


How do we create a new Eloquent Collection in Laravel 4, without using Query Builder?

There is a newCollection() method which can be overridden by that doesn't really do job because that is only being used when we are querying a set result.

I was thinking of building an empty Collection, then fill it with Eloquent objects. The reason I'm not using array is because I like Eloquent Collections methods such as contains.

If there are other alternatives, I would love to hear them out.


回答1:


It's not really Eloquent, to add an Eloquent model to your collection you have some options:

In Laravel 5 you can benefit from a helper

$c = collect(new Post);

or

$c = collect();
$c->add(new Post);

OLD Laravel 4 ANSWER

$c = new \Illuminate\Database\Eloquent\Collection;

And then you can

$c->add(new Post);

Or you could use make:

$c = Collection::make(new Post);



回答2:


As of Laravel 5. I use the global function collect()

$collection = collect([]); // initialize an empty array [] inside to start empty collection

this syntax is very clean and you can also add offsets if you don't want the numeric index, like so:

$collection->offsetSet('foo', $foo_data); // similar to add function but with
$collection->offsetSet('bar', $bar_data); // an assigned index



回答3:


Just to add on to the accepted answer, you can also create an alias in config/app.php

'aliases' => array(

    ...
    'Collection'      => Illuminate\Database\Eloquent\Collection::class,

Then you simply need to do

$c = new Collection;



回答4:


I've actually found that using newCollection() is more future proof....

Example:

$collection = (new Post)->newCollection();

That way, if you decide to create your own collection class for your model (like I have done several times) at a later stage, it's much easier to refactor your code, as you just override the newCollection() function in your model




回答5:


Laravel >= 5.5

This may not be related to the original question, but since it's one of the first link in google search, i find this helpful for those like me, who are looking for how to create empty collection.

If you want to manually create a new empty collection, you can use the collect helper method like this:

$new_empty_collection = collect();

You can find this helper in Illuminate\Support\helpers.php

snippet:

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:


It is better to use the Injection Pattern and after $this->collection->make([]) than 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:


In Laravel 5 and Laravel 6 you can resolve the Illuminate\Database\Eloquent\Collection class out of the service container and then add models into it.

$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());

For more information about understanding resolving objects out of the service container in laravel take a look here: https://laravel.com/docs/5.7/container#resolving



来源:https://stackoverflow.com/questions/23599584/how-to-manually-create-a-new-empty-eloquent-collection-in-laravel-4

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!