如何在不使用查询生成器的情况下在Laravel 4中创建新的Eloquent Collection?
有一个newCollection()
方法可以被覆盖,因为它只是在我们查询设置结果时才被使用。
我正在考虑构建一个空的Collection,然后用Eloquent对象填充它。我之所以不使用数组是因为我喜欢Eloquent Collections方法,例如contains
。
如果还有其他选择,我很乐意听听。
答案 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)
这可能与原始问题无关,但由于它是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);