如何在 Laravel 4 中手动创建一个新的空 Eloquent 集合
Posted
技术标签:
【中文标题】如何在 Laravel 4 中手动创建一个新的空 Eloquent 集合【英文标题】:How to manually create a new empty Eloquent Collection in Laravel 4 【发布时间】:2014-06-29 06:11:26 【问题描述】:我们如何在 Laravel 4 中创建一个新的 Eloquent 集合,而不使用 Query Builder?
有一个 newCollection()
方法可以被覆盖,但实际上并没有起到作用,因为它只在我们查询集合结果时使用。
我正在考虑构建一个空集合,然后用 Eloquent 对象填充它。我不使用数组的原因是因为我喜欢 Eloquent Collections 方法,例如 contains
。
如果还有其他选择,我很想听听。
【问题讨论】:
【参考方案1】:这并不是真正的 Eloquent,要将 Eloquent 模型添加到您的集合中,您有一些选择:
在 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);
【讨论】:
几乎可以工作了!我认为\Illuminate\Support\Collection
是\Illuminate\Database\Eloquent\Collection
的更通用版本。所以我想,它毕竟是 Eloquent 的一部分。希望这对其他人有所帮助。
是的,我应该看看它,因为我错过了 add 方法,它只存在于 Eloquent\Collection 中。已编辑。
@JofryHS 如果使用\Illuminate\Support\Collection
,您可以使用$c->push(new Post);
代替add 方法。
我更喜欢使用静态方法:$c = \Illuminate\Database\Eloquent\Collection::make();
。这确保了正确的工厂实例化。
Make 完全一样:return new static($items);
【参考方案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】:我实际上发现使用newCollection()
更适合未来......
例子:
$collection = (new Post)->newCollection();
这样,如果您决定在稍后阶段为您的模型创建自己的集合类(就像我已经做过几次一样),重构代码会容易得多,因为您只需覆盖您的 newCollection()
函数型号
【讨论】:
【参考方案4】:只是添加到接受的答案,您还可以在config/app.php
中创建一个别名
'aliases' => array(
...
'Collection' => Illuminate\Database\Eloquent\Collection::class,
那么你只需要这样做
$c = new Collection;
【讨论】:
【参考方案5】:Laravel >= 5.5
这可能与原始问题无关,但由于它是谷歌搜索中的第一个链接之一,我发现这对像我这样正在寻找如何创建空集合的人很有帮助。
如果你想手动创建一个新的空集合,你可以像这样使用collect
helper 方法:
$new_empty_collection = collect();
你可以在Illuminate\Support\helpers.php
找到这个助手
sn-p:
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);
【讨论】:
作为记录,collect()
助手的提及已在您发布此答案前 2 年编辑为已接受的答案。
是否可以制作Illuminate\Database\Eloquent\Collection
类型的空集合?【参考方案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\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
【讨论】:
这应该是 100% 被接受的答案。其他答案解决了支持集合而不是雄辩的集合!【参考方案8】:我就是这样用的:
$coll = new Collection();
$coll->name = 'name';
$coll->value = 'value';
$coll->description = 'description';
并将其作为正常的 Collection 使用
dd($coll->name);
【讨论】:
以上是关于如何在 Laravel 4 中手动创建一个新的空 Eloquent 集合的主要内容,如果未能解决你的问题,请参考以下文章