为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

PHP
哆啦的时光机 2023-10-01 17:27:01
我有一个表,除其他列外,还包含一列浏览器版本。我只是想从记录集中知道每种类型的浏览器有多少个。我的代码是:$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                },            ],                   }
查看完整描述

2 回答

?
慕仙森

TA贡献1827条经验 获得超7个赞

实现此目的的一种方法是在字符串中查找浏览器名称,并将它们解析为查询中的浏览器名称。所以类似的东西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  1

Firefox 1

Safari  2

我的测试数据是:


"Chrome Mobile"

"Firefox 79"

"Mobile Safari 13.1.2"

"Mobile Safari 15.1.2"


查看完整回答
反对 回复 2023-10-01
?
心有法竹

TA贡献1866条经验 获得超5个赞

您可以使用 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();


查看完整回答
反对 回复 2023-10-01
  • 2 回答
  • 0 关注
  • 62 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信