Laravel Eloquent concat 和 groupBy() AND 返回每组的一个标题

我有一个表,除其他列外,还包含一列浏览器版本。我只是想从记录集中知道每种类型的浏览器有多少个。


我的代码是:


$whereBrowser = [['owner', '=', 12]];

        $browser = ProfileTracker::where($whereBrowser)->whereBetween('created_at', [Carbon::now()->startOfMonth(), Carbon::now()->endOfMonth()])->select([

            DB::raw('browser'),

            DB::raw('COUNT(browser) as value')

        ])->groupBy("browser")->orderBy("value", "desc")->take(10)->get();


输出 :


          "browser": [

              {

                  "browser": "Chrome Mobile 84",

                  "value": 144

              },

              {

                  "browser": "Chrome Mobile 80",

                  "value": 84

              },

              {

                  "browser": "Chrome 84",

                  "value": 27

              },

              {

                  "browser": "Chrome 30",

                  "value": 22

              },

              {

                  "browser": "Chrome Mobile 83",

                  "value": 19

              },

              {

                  "browser": "Chrome Mobile 47",

                  "value": 10

              },

              {

                  "browser": "Firefox 79",

                  "value": 8

              },

              {

                  "browser": "Mobile Safari",

                  "value": 8

              },

              {

                  "browser": "Mobile Safari 13.1.2",

                  "value": 6

              }

          ],

         

      }

我想对所有浏览器进行分组,没有浏览器版本,如下所示:


            "browser": [

                {

                    "browser": "Chrome",

                    "value": 306

                },

                {

                    "browser": "Safari",

                    "value": 14

                },

                {

                    "browser": "Firefox",

                    "value": 8

                },

            ],

           

        }


哆啦的时光机
浏览 88回答 2
2回答

慕仙森

实现此目的的一种方法是在字符串中查找浏览器名称,并将它们解析为查询中的浏览器名称。所以类似的东西Mobile Safari 15.1.2将被解析为Safari:ProfileTracker::selectRaw('    CASE         WHEN browser LIKE '%firefox%' THEN 'Firefox'        WHEN browser LIKE '%chrome%' THEN 'Chrome'        WHEN browser LIKE '%safari%' THEN 'Safari'    END AS browser_name,    count(1) AS count')->groupBy('browser_name')->get();请注意,我删除了查询生成器的部分内容,以使此示例更具可读性。您可以自己添加回您需要的任何内容。这会给你:Chrome  1Firefox 1Safari  2我的测试数据是:"Chrome Mobile""Firefox 79""Mobile Safari 13.1.2""Mobile Safari 15.1.2"

心有法竹

您可以使用 SUBSTRING_INDEX 函数来提取浏览器名称的第一个字符串:      $browser = ProfileTracker::where($whereBrowser)       ->selectRaw("browser,SUBSTRING_INDEX(browser, ' ', 1) AS BrowserName,COUNT(browser) as value")       ->whereBetween('created_at', [Carbon::now()->startOfMonth(), Carbon::now()->endOfMonth()])       ->groupBy("BrowserName")->orderBy("value", "desc")->take(10)->get();
打开App,查看更多内容
随时随地看视频慕课网APP