如何在 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 集合的主要内容,如果未能解决你的问题,请参考以下文章

EasyRTC的Web开发过程中如何创建新的空分支?

EasyRTC的Web开发过程中如何创建新的空分支?

将相同的外键添加到 4 行 Laravel

yaml-cpp 创建一个新的空地图?

如何访问我在 Laravel 4 中手动发送的请求的查询字符串参数?

如何手动创建 laravel 迁移文件