合并集合

pan*_*hro 1 laravel eloquent laravel-5

我有一个原始查询:

$data = Product::hydrateRaw(//sql here);
Run Code Online (Sandbox Code Playgroud)

这将返回一个集合.

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

$data2 = Product::take(3)->get();
Run Code Online (Sandbox Code Playgroud)

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

$data->merge($data2);
Run Code Online (Sandbox Code Playgroud)

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

我哪里错了?

Kun*_*rei 7

现在,当使用Product ::你会得到一个Eloquent Collection对象,它保存你使用get或任何其他关系的结果.这里的好处是你可以实际选择和自定义你的Collection,而不是使用普通数组或其他东西.

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

请注意"合并"功能不会修改您当前的Collection $数据.而不是那样,它只是返回你合并的集合,就是这样.

$mergeData = $data->merge($data2)
Run Code Online (Sandbox Code Playgroud)

如果仍然无法解决您的需求,请随意创建自定义集合,然后在其中创建一个新方法:

public function merge(Collection $collection) {

    foreach ($collection as $item)
    {
        $this->items[$item->getKey()] = $item;
    }

    //Now this will change your current Collection
}
Run Code Online (Sandbox Code Playgroud)

或者与阵列一起使用,不需要任何水合作用

public function merge(array $firstResults) {
    //Do your logic of merging $firstResults with your current collection
}
Run Code Online (Sandbox Code Playgroud)

问题是现有的"merge"方法,只接受数组作为参数,并且结果数组不包含任何关系.

除此之外,不幸的是水合物也不能保持你的关系,所以这可能是一个小的或大的障碍.

除此之外,祝你好运.


Daa*_*tje 6

当你使用toBase()它的时候它就起作用了;

$mergedCollection = $collection1->toBase()->merge($collection2);
Run Code Online (Sandbox Code Playgroud)