如何在Laravel 4中手动创建一个新的空Eloquent Collection

时间:2014-05-12 01:00:07

标签: php laravel laravel-4 eloquent

如何在不使用查询生成器的情况下在Laravel 4中创建新的Eloquent Collection?

有一个newCollection()方法可以被覆盖,因为它只是在我们查询设置结果时才被使用。

我正在考虑构建一个空的Collection,然后用Eloquent对象填充它。我之所以不使用数组是因为我喜欢Eloquent Collections方法,例如contains

如果还有其他选择,我很乐意听听。

8 个答案:

答案 0 :(得分:76)

这不是真正的雄辩,要为您的收藏添加一个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);

答案 1 :(得分:10)

从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

答案 2 :(得分:4)

只需添加已接受的答案,您还可以在config/app.php

中创建别名
'aliases' => array(

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

然后你只需要做

$c = new Collection;

答案 3 :(得分:3)

我实际上发现使用newCollection()更具未来性......

示例:

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

这样,如果您决定在稍后阶段为您的模型创建自己的集合类(就像我已经多次完成),那么重构代码要容易得多,因为您只需覆盖{{ 1}}模型中的函数

答案 4 :(得分:2)

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);
    }
}

答案 5 :(得分:1)

最好使用注射模式,并在$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([]);
...
}

答案 6 :(得分:0)

在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

答案 7 :(得分:0)

我正在使用这种方式:

$coll = new Collection();
    
$coll->name = 'name';
$coll->value = 'value';
$coll->description = 'description';

并将其用作普通集合

dd($coll->name);