Php 使用雄辩的语言检索唯一的访问者

Php 使用雄辩的语言检索唯一的访问者,php,laravel,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

我试图用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轴
y轴


更新 我希望保留初始模式,以便能够使用此辅助方法构造图表的
x轴
y轴

$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
    ];
}

$visitors=visitors::all()->unique('ip')
将首先返回所有
访问者
,然后它将减少
集合
,并根据
ip
字段仅返回
唯一的
结果

编辑

$visitors = DB::table('XXXXXX')->distinct('ip')->select('created_at as date', DB::raw('count(*) as x'));

只需使用表名更改
XXXXX
$visitors=visitors::all()->unique('ip')
将首先返回所有
访问者
,然后它将减少
集合
,并根据
ip
字段仅返回
唯一的
结果

编辑

$visitors = DB::table('XXXXXX')->distinct('ip')->select('created_at as date', DB::raw('count(*) as x'));
只需使用表名更改
XXXXX

如何使用helper

编辑:

$visitors = DB::table('XXXXXX')->distinct('ip')->select('created_at as date', DB::raw('count(*) as x'));
使用helper怎么样

编辑:

$visitors = DB::table('XXXXXX')->distinct('ip')->select('created_at as date', DB::raw('count(*) as x'));

在您的示例中,这更像是一个SQL问题。在MySQL中使用聚合函数只能得到一个结果(行)

如果在同一查询中,您还希望接收特定IP的访问次数,那么您需要以某种方式加入。“雄辩的方式”可以是这样的:

在您的
访客
模型中,包括以下关系:

public function visitsWithIp() {
    return $this->hasMany(Visitors::class, 'ip', 'ip');
}
有了这个,你可以做一个有说服力的查询,比如:

$visitors = Visitors::groupBy('ip')
    ->withCount('visitsWithIp')
    ->get('ip', 'created_at', 'count_visitsWithIp');
我没有测试上面的代码,但我相信您已经了解了它背后的想法;)


在您的示例中,这更像是一个SQL问题。在MySQL中使用聚合函数只能得到一个结果(行)

如果在同一查询中,您还希望接收特定IP的访问次数,那么您需要以某种方式加入。“雄辩的方式”可以是这样的:

在您的
访客
模型中,包括以下关系:

public function visitsWithIp() {
    return $this->hasMany(Visitors::class, 'ip', 'ip');
}
有了这个,你可以做一个有说服力的查询,比如:

$visitors = Visitors::groupBy('ip')
    ->withCount('visitsWithIp')
    ->get('ip', 'created_at', 'count_visitsWithIp');
我没有测试上面的代码,但我相信您已经了解了它背后的想法;)


谢谢您的回答,但我希望保留初始结构,以便能够使用生成图表后的辅助方法。不要使用
Visitors::all()
,只要您确定表不会很大。这会将所有表行加载到PHP中。不太理想。谢谢您的回答,但我希望保留初始结构,以便能够使用生成图表后的辅助方法。不要使用
Visitors::all()
,只要您确定表不会很大。这会将所有表行加载到PHP中。不太理想。谢谢您的回答,但我希望保留初始结构,以便能够使用生成图表后的辅助方法扫描您是否将其包含在问题中?更新问题以将其包含在创建图表的函数中使用的
$data
变量是什么?你能包含完整的代码吗?请用完整的示例更新谢谢你的回答,但我想保留初始结构,以便能够使用我在构建图表后使用的辅助方法扫描你是否将其包含在你的问题中?更新问题以包含它你在问题中使用的
$data
变量是什么创建图表的函数?你能包括完整的代码吗?请用完整的例子更新