【问题标题】:How can group a laravel collection like MySQL GROUP_CONCAT如何对 MySQL GROUP_CONCAT 之类的 laravel 集合进行分组
【发布时间】:2021-07-16 21:26:47
【问题描述】:

我有一个 Laravel 函数,它从两个或三个以上的单独集合(不同的 BD 查询)返回这个结果合并集合:

Illuminate\Support\Collection {#3361
     all: [
       {#3359
         +"id": 3,
         +"name": "Jose Achecar",
         +"role": 1,
       },
       {#3344
         +"id": 1,
         +"name": "Oswaldo Graterol",
         +"role": 1,
       },
       {#3384
         +"id": 4,
         +"name": "Assaily",
         +"role": 2,
       },
       {#3372
         +"id": 3,
         +"name": "Jose Achecar",
         +"role": 2,
       },       
       {#3349
         +"id": 5,
         +"name": "Alejandro",
         +"role": 1,
       },
       {#3382
         +"id": 2,
         +"name": "Marcos Mendozas",
         +"role": 2,
       },
     ],
   }

如您所见,有一个元素(带有id 3 的那个)有两个角色并显示了两次

有一个方法或助手可以用来对集合进行分组并得到类似这样的东西:

  Illuminate\Support\Collection {#3361
     all: [
       {#3359
         +"id": 3,
         +"name": "Jose Achecar",
         +"role": [1,2],
       },
       {#3344
         +"id": 1,
         +"name": "Oswaldo Graterol",
         +"role": [1],
       },
       {#3384
         +"id": 4,
         +"name": "Assaily",
         +"role": [2],
       },    
       {#3349
         +"id": 5,
         +"name": "Alejandro",
         +"role": [1],
       },
       {#3382
         +"id": 2,
         +"name": "Marcos Mendozas",
         +"role": [2],
       },
     ],
   }

【问题讨论】:

  • 你能发布你的代码吗?您是否有一个包含用户详细信息和角色的平面表,或者两个不同的表,usersroles,具有 many-to-many 关系?
  • 您好,谢谢,我有 3 个表:用户、角色、组。一个用户可以在一个组中拥有多个角色。这篇文章中的集合就是一个例子,确实集合有更多的字段,因为我认为我在DB查询时不能使用group_concat这样的函数。
  • 顺便说一下,我没有定义这些表之间的关系。
  • 我建议你看看关系,它有助于简化查询。你能发布你的 laravel 雄辩的查询吗? (是的,很高兴您将代码减少到最少,这有助于理解您的问题:-))

标签: php laravel laravel-7 laravel-collection


【解决方案1】:

您没有包含任何代码,这使得回答变得更加困难。

基本上,在 Laravel 中使用数据库有两种方法:

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

DB facade 提供查询构建的接口,而 Eloquent 提供表示表的对象(模型)。

来自documentation

Laravel 包含 Eloquent,一个对象关系映射器 (ORM) 使与您的数据库交互变得愉快。使用时 Eloquent,每个数据库表都有一个对应的“Model”被使用 与该表进行交互。除了从 数据库表,Eloquent 模型允许您插入、更新和 也从表中删除记录。

现在,如果您使用模型,您的朋友是with() 方法。你有很多信息,例如可以阅读this answer
简而言之 - 想法是执行一个 SELECT 查询,然后使用 foreach() 函数迭代结果。

否则,假设你不使用模型,你可以用纯php代码实现你想要的(请阅读this answer)。

【讨论】:

    【解决方案2】:

    如果没有更多信息,我会这样做:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-10-14
      • 2017-09-14
      • 2021-04-18
      • 1970-01-01
      • 2018-08-20
      • 2018-05-10
      • 2012-09-19
      相关资源
      最近更新 更多