使用Eloquent检索唯一身份访问者

时间:2018-02-10 19:23:26

标签: php laravel

我尝试使用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 axisy axis

更新 我想保留初始架构,以便能够使用这种辅助方法来构建图表的x axisy 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
    ];
}

3 个答案:

答案 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');

我没有测试上面的代码,但我确信你能理解它背后的想法;)

Details about casting your date between MySQL and PHP

Details about counting eloquent relations