如何对像 MySQL GROUP_CONCAT 这样的 Laravel 集合进行分组

问题描述

我有一个 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 中有两种处理数据库的方法:

  1. 数据库外观
  2. 雄辩的模型

虽然 DB facade 提供了一个用于查询构建的接口,但 Eloquent 提供了代表表的对象(模型)。

来自documentation

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());

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...