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
},
],

}

实现这一点的一种方法是在字符串中查找浏览器名称,并将其解析为查询中的浏览器名称。所以类似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"

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

相关内容

最新更新