【问题标题】:How to get last months total web page views with Laravel Eloquent如何使用 Laravel Eloquent 获取上个月的总网页浏览量
【发布时间】:2020-09-12 19:31:48
【问题描述】:

我有这个 post_views 表

created_at         post_id       ip
==========         =======       =======
01-01-2020            3            127.0.0.1
01-01 2020            5            127.0.0.1
02-01 2020            5            127.0.0.1
03-01 2020            5            222.33.44.55

06-02 2020            3            222.33.44.55
06-02 2020            3            127.0.0.1
10-02 2020            5            33.44.55.66

02-03 2020            3            22.33.65.22
02-03 2020            3            22.33.65.22
02-03 2020            5            11.44.55.66

我需要总结每天的访问量,以获得使用此表的 3 个上个月的总网页浏览量,我的意思是这个结果:

January= 3 visits
February = 3 visits
March = 2 visits

【问题讨论】:

标签: php laravel laravel-5 eloquent


【解决方案1】:

希望这样的事情对你有所帮助。

在您的Post 模型中:

public function getLastThreeMonthViewsByIP($ip)
{
    $data = [];

    // loop 3 months
    for ($i = -3; $i < 0; $i++)
    {
        $timestamp = strtotime("$i month");
        
        $monthNumber = date('n', $timestamp);

        // from this post
        $result = $this->views()
            // in this month
            ->whereMonth('created_at', $monthNumber)
            // from this ip
            ->where('ip', $ip)
            // group IP
            ->groupBy('ip')
            // count all
            ->selectRaw('count(*) AS total')
            // and return first 
            ->first();

        // if there are any results, add to data
        if ($result)
        {
            $monthName = date('F', $timestamp);

            $data[] = [
                'monthNumber' => $monthNumber,
                'monthName' => $monthName,
                'total' => $result->total,
            ];
        }
    }

    return $data;
}

【讨论】:

  • 谢谢,这很有帮助,但我每天只需要计算一次观看次数,除非是另一个 ip。
  • 你能再解释一下吗?
  • 哦,我明白了,post_id 无关紧要。您需要每月的应用程序/项目总唯一 (ip) 视图。我说的对吗?
  • 我需要从 post_views 表中获取关于最近 3 个月网页访问的柱形图的查看次数......所以我们认为每个 ip 每天只有 1 次查看,并且每个月的查看次数总和为总计
  • 是的,你是对的 :),每个 ip 每天可以进行 1 次查看
【解决方案2】:

您可以在运行下一个 SQL 查询时生成此信息:

SELECT month, count(*) AS total
FROM (
    SELECT DATE_FORMAT(created_at, '%Y-%m') AS month
    FROM post_views
    GROUP BY month, ip
) AS calculated
GROUP BY month;

结果:

2020-01, 3
2020-02, 3
2020-03, 2

要使其与 Laravel 一起使用:

$result = DB::raw("
    SELECT month, count(*) AS total
    FROM (
        SELECT DATE_FORMAT(created_at, '%Y-%m') AS month
        FROM `post_views`
        WHERE `created_at` >= DATE_FORMAT(now() - interval ? month, '%Y-%m-01') 
        GROUP BY DATE_FORMAT(`created_at`, '%Y-%m'), ip
    ) AS calculated
    GROUP BY `month`
", [3]); // last 3 months

dd($result); // to see results

希望对您有所帮助!

【讨论】:

  • 我在 laravel 5.8 中遇到了一个错误...第一个答案给了我一个想法来获得总视图,但使用会话 ID
  • 当我测试它时,它显示相同;表达式 {#542 ▼ #value: """ SELECT month, count(*) AS total FROM ( SELECT DATE_FORMAT(created_at, '%Y-%m') AS month FROM post_views......... ..........
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-05
  • 1970-01-01
相关资源
最近更新 更多