如何在控制器中合并Laravel对象

30

我有一个控制器,想要合并来自多个具有相似结构的表格的数据。最终我希望得到一个对象,在控制器中返回该对象,以便在 Backbone 中解析。

我想要做类似这样的事情:

public function index()
{
    $mc = MainContact::where('verified', '=', '1')->get();
    $sm = SendMessage::where('verified', '=', '1')->get();

    $obj = (object) array_merge((array) $mc, (array) $sm);
    return $obj;
}

我被StackOverflow上的另一篇帖子告知,在PHP 5.3+中这是可行的。然而在Laravel中,这会返回以下错误:

UnexpectedValueException: The Response content must be a string or object implementing
 __toString(), "object" given.

我该如何在 Laravel 中实现这个方法?在 Laravel 中,$mcsm 都会返回有效的对象。


我现在正在使用 Laravel 4 alpha 版本。当 beta 版本发布时,无论是今天还是周一或任何其他时间,我都会升级到 beta 版本。 - sehummel
我尝试创建一个带有空白__toString()方法的单独类,但不知道在Laravel 4中应该将其存储在哪里。 - sehummel
它看起来像是类存放在vendor文件夹中。 - sehummel
vendors文件夹到Eloquent的路径是什么? - sehummel
6个回答

53

现在你可以使用$new_collection = $collection->merge($other_collection)

这个函数适用于Laravel 4,并且似乎可以处理数组和集合。


1
在我的情况下,在集合合并后,它会吞噬掉一些行。 - Ali Gajani
你的集合是否使用字符串作为键?Collection::merge使用PHP的array_merge函数,它会覆盖字符串键但不会覆盖整数键。如果这是一个问题,你可以通过子类化Laravel Collection来重写实现。 - trm42
在我的情况下,只有$other_collection保留了,而$collection消失了。为什么??? - Pathros
1
@AliGajani,是的。如果给定项中的字符串键与原始集合中的字符串键匹配,则给定项的值将覆盖原始集合中的值。但是,如果给定项的键是数字,则这些值将附加到集合的末尾。 在此处查看:https://laravel.com/docs/5.7/collections#method-merge - Allan Mwesigwa

36
你可以将两个查询结果的数组合并,然后使用下面所示的带有JSON输出的响应。
$array = array_merge($mc->toArray(), $sm->toArray());
return Response::json($array);

10

这就是我想要的。谢谢。 - Cholowao

3
Route::get('test', function(){
    $rank = Rank::get();
    $policy = Policy::get();
    $obj = (object)array_merge_recursive((array)$rank , (array)$policy);
    var_dump($obj);
});

这对我很有帮助。使用array_merge_recursive()代替array_merge。


0

我使用concat函数,对我来说很有效。像这样:

$role1 = User::where('role', '=', 'role1')->get();
$role2 = User::where('role', '=', 'role2')->get();
$allRoles = $role1->concat($role2);

-4
您可以简单地使用array_merge(firstObject,secondObject)函数。
$obj = array_merge($mc, $sm);
return $obj;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接