【问题标题】:How to manually create a new empty Eloquent Collection in Laravel 4如何在 Laravel 4 中手动创建一个新的空 Eloquent 集合
【发布时间】:2014-06-29 06:11:26
【问题描述】:

我们如何在 Laravel 4 中创建一个新的 Eloquent 集合,而不使用 Query Builder?

有一个 newCollection() 方法可以被覆盖,但实际上并没有起到作用,因为它只在我们查询集合结果时使用。

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

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

【问题讨论】:

    标签: php laravel laravel-4 eloquent


    【解决方案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);

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2021-02-13
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2020-02-02
            • 1970-01-01
            相关资源
            最近更新 更多