合并集合

时间:2015-06-11 11:07:08

标签: laravel eloquent laravel-5

我有一个原始查询:

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

这将返回一个集合。

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

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

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

$data->merge($data2);

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

我哪里错了?

3 个答案:

答案 0 :(得分:7)

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

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

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

$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
}

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

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

除此之外,祝你好运。

答案 1 :(得分:0)

试试这个:

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

请参阅here

答案 2 :(得分:0)

使用toBase()时有效;

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