【问题标题】:Merging collections合并集合
【发布时间】:2015-08-27 01:08:10
【问题描述】:

我有一个原始查询:

$data = Product::hydrateRaw(//sql here);

这会返回一个集合。

然后我执行进一步的查询:

$data2 = Product::take(3)->get();

然后我希望合并两个集合:

$data->merge($data2);

不幸的是,合并似乎没有效果,当我 dd() 时,集合只包含 $data 而不是 $data2。

我哪里错了?

【问题讨论】:

    标签: laravel eloquent laravel-5


    【解决方案1】:

    现在,当使用 Product:: 时,您将获得一个 Eloquent Collection 对象,该对象保存您使用 get 或任何其他关系的结果。这里的好处是您实际上可以选择和自定义您的集合,而不是使用普通数组或其他东西。

    请在此处阅读更多详细信息:http://laravel.com/docs/5.1/eloquent-collections#available-methods。 Eloquent Collection 对象有很多可用的方法,其中之一就是“合并”。

    请注意“合并”功能不会修改您当前的 Collection $data。取而代之的是,它只是返回您合并的集合,仅此而已。

    $mergeData = $data->merge($data2)
    

    如果仍然无法解决您的需求,请随时创建您的自定义集合并在那里创建一个新方法,例如:

    public function merge(Collection $collection) {
    
        foreach ($collection as $item)
        {
            $this->items[$item->getKey()] = $item;
        }
    
        //Now this will change your current Collection
    }
    

    或与数组一起使用,不需要任何水合

    public function merge(array $firstResults) {
        //Do your logic of merging $firstResults with your current collection
    }
    

    问题是现有的“合并”方法,只接受数组作为参数,结果数组不包含任何关系。

    除此之外,不幸的是 Hydrate 也不能为你的关系补水,所以这可能是一个小的或大的障碍。

    除此之外,祝你好运。

    【讨论】:

    • 看来你没看够。请查看:laravel.com/api/5.0/Illuminate/Database/Eloquent/…。问题是你需要有 $mergedData = $data->merge($data2)。合并功能不会修改您的 Collection $data。它只是返回您的合并结果。
    • 不,我只是编辑我的回复。请再次检查我的回复并投下正确的一票。谢谢
    • 感谢您的帮助。我很感激。
    【解决方案2】:

    当您使用toBase() 时,它可以工作;

    $mergedCollection = $collection1->toBase()->merge($collection2);
    

    【讨论】:

      【解决方案3】:

      试试这个:

      $data2 = Product::take(3)->get()->toArray();
      $data->merge($data2);
      

      here

      【讨论】:

      • 谢谢,但是:“调用数组上的成员函数 getKey()”
      • 这也是旧文档,现在是:Collection merge(mixed $items)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-08
      • 2012-08-03
      • 2017-02-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多