如何在 Laravel4中手动创建一个新的空的雄辩集合

如何在不使用 QueryBuilder 的情况下在 Laravel4中创建一个新的 EloquentCollection?

有一个 newCollection()方法可以被它覆盖,但是它并不能真正完成任务,因为它只在我们查询一个设置的结果时使用。

我想构建一个空 Collection,然后用 Eloquent 对象填充它。我不使用数组的原因是因为我喜欢雄辩集合方法,如 contains

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

121308 次浏览

这不是真正的雄辩,添加一个雄辩模型到您的集合,你有一些选择:

Laravel 5号中,你可以从帮助者中受益

$c = collect(new Post);

或者

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

老 Laravel 4答案

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

然后你就可以了

$c->add(new Post);

或者你可以使用 make:

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

只要添加到已接受的答案中,您还可以在 config/app.php中创建别名

'aliases' => array(


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

那你只需要

$c = new Collection;

注射模式和 $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([]);
...
}

事实上,我发现使用 newCollection()更能证明未来... ..。

例如:

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

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

从 Laravel5开始,我使用了全局函数 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

幼虫 > = 5.5

这可能与最初的问题无关,但因为它是谷歌搜索的第一个链接之一,我发现这对于像我这样的人来说很有帮助,他们正在寻找如何创建空集合。

如果你想手动创建一个 新的空集合,你可以像这样使用 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);
}
}

在 Laravel5和 Laravel6中,您可以将 Illuminate\Database\Eloquent\Collection类从服务容器中解析出来,然后将模型添加到其中。

$eloquentCollection = resolve(Illuminate\Database\Eloquent\Collection::class);
// or app(Illuminate\Database\Eloquent\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

我是这样使用的:

$coll = new Collection();
    

$coll->name = 'name';
$coll->value = 'value';
$coll->description = 'description';

并使用它作为正常的收集

Dd ($coll-> name) ;

对我来说,有效的方法是命名 use 名称空间并直接实例化它:

use Illuminate\Database\Eloquent\Collection as EloquentCollection;


# Usage
$this->latest_posts = new EloquentCollection();

允许我合并两个数据子集的雄辩的收集结果,这维护了关系-一个正常的收集(collect())失去了关系,可能还有一些更多的元数据。

$limit = 5;
$this->latest_posts = new EloquentCollection();


$pinned_posts = PinnedPostReference::where('category', $category)->get();
if($pinned_posts->count() > 0) {
foreach($pinned_posts as $ppost) {
$this->latest_posts->push($ppost->post);
}
}


# Another Eloquent result set ($regular_posts)
foreach($regular_posts as $regular_post) {
$this->latest_posts->push($regular_post);
}