问题描述
我有一个 Laravel 函数,它从两个或三个以上的单独集合(不同的 BD 查询)返回这个结果合并集合:
Illuminate\Support\Collection {#3361
all: [
{#3359
+"id": 3,+"name": "Jose Achecar",+"role": 1,},{#3344
+"id": 1,+"name": "Oswaldo Graterol",{#3384
+"id": 4,+"name": "Assaily",+"role": 2,{#3372
+"id": 3,{#3349
+"id": 5,+"name": "Alejandro",{#3382
+"id": 2,+"name": "marcos Mendozas",],}
如您所见,有一个元素(带有 id
3 的元素)具有两个角色并显示两次
Illuminate\Support\Collection {#3361
all: [
{#3359
+"id": 3,+"role": [1,2],+"role": [1],+"role": [2],}
解决方法
您没有包含任何代码,这使得回答变得更加困难。
基本上,在 Laravel 中有两种处理数据库的方法:
- 数据库外观
- 雄辩的模型
虽然 DB facade 提供了一个用于查询构建的接口,但 Eloquent 提供了代表表的对象(模型)。
Laravel 包含 Eloquent,一个对象关系映射器 (ORM) 使与数据库交互变得愉快。使用时 Eloquent,每个数据库表都有一个对应的“Model”被使用 与该表进行交互。除了从检索记录 数据库表,Eloquent 模型允许您插入、更新和 也删除表中的记录。
现在,如果您使用模型,您的朋友就是 with() 方法。你有很多资料,例如可以阅读this answer。
简而言之 - 这个想法是执行一个 SELECT
查询,然后使用 foreach() 函数迭代结果。
否则,假设您不使用模型,您可以使用纯php代码实现您想要的(请阅读this answer)。
,没有进一步的信息,我会这样做:
$coll = $coll->reduce(function($carry,$item) {
if (!$carry->contains('id',$item->id)) {
$newItem = clone $item;
$newItem->role = [ $newItem->role ];
$carry->push($newItem);
} else {
$carry->firstWhere('id',$item->id)->role[] = $item->role;
}
return $carry;
},new Illuminate\Support\Collection());