我尝试使用eloquent检索网站的唯一身份访问者,但它正在检索访问该网站的唯一IP的次数。
$visitors = Visitors::
groupBy('ip')
->get(array(
DB::raw('Date(created_at) as
DB::raw('COUNT(*) as "x"')
));
如果我碰巧做了一个简单的dd(Visitors::groupBy('ip')->get())
我得到了只有一个结果回归的结果。
这是我表格的结构
$table->increments('id');
$table->string('ip', 40);
$table->timestamps();
我想按照我们获取变量x
的访问者数量的方案,因为我使用始终相同的x
来构建多个图表来构建x axis
和y axis
更新
我想保留初始架构,以便能够使用这种辅助方法来构建图表的x axis
和y axis
:
$pageViewsPerDay = $this->pageViewsPerDay();
private function pageViewsPerDay(){
$visitors = Visitors::where('created_at', '>=', Carbon::now()->subMonth())
->groupBy('date')
->orderBy('date', 'DESC')
->get(array(
DB::raw('Date(created_at) as date'),
// x = pageViewsPerDay
DB::raw('COUNT(*) as "x"')
));
$labels = $this->constructLabel($visitors);
return $labels;
}
private function constructLabel($data){
$i = 0;
$len = count($data);
$xAxis = '[';
$yAxis = '[';
foreach ($data as $dateParticipant) {
// Contrust the x label -> ["2018-12-14", "2018-12-31", "2012-14-21"]
// Construct y label -> [10, 20, 2]
$xAxis = $xAxis . '"' . $dateParticipant->date . '"';
$yAxis = $yAxis . $dateParticipant->x;
// It means we are not in the last element
if ($i != $len - 1) {
$xAxis = $xAxis . ",";
$yAxis = $yAxis . ",";
}
$i++;
}
$xAxis = $xAxis . ']';
$yAxis = $yAxis . ']';
return [
'xAxis' => $xAxis,
'yAxis' => $yAxis
];
}
答案 0 :(得分:1)
$visitors = Visitors::all()->unique('ip');
将首先返回所有Visitors
,然后根据Collection
字段缩小unique
并仅返回ip
个结果。
修改强>
$visitors = DB::table('XXXXXX')->distinct('ip')->select('created_at as date', DB::raw('count(*) as x'));
只需使用表格名称
更改XXXXX
即可
答案 1 :(得分:1)
使用unique助手
怎么样?Visitors::all()->unique('ip');
修改强>
$visitors = DB::table('XXXXXX')->distinct('ip')->select('created_at as date', DB::raw('count(*) as x'));
答案 2 :(得分:0)
这更像是示例中的SQL问题。在MySQL中使用聚合函数只会导致一个结果(行)。
如果您在同一查询中也希望收到特定IP的访问次数,那么您需要以某种方式加入。 "雄辩的方式"可以看起来像:
在Visitors
模型中包含类似的关系:
public function visitsWithIp() {
return $this->hasMany(Visitors::class, 'ip', 'ip');
}
通过这个,你可以做一个雄辩的查询,如:
$visitors = Visitors::groupBy('ip')
->withCount('visitsWithIp')
->get('ip', 'created_at', 'count_visitsWithIp');
我没有测试上面的代码,但我确信你能理解它背后的想法;)