Генерация статистики в Laravel - PullRequest
2 голосов
/ 15 октября 2019

Я новичок в Laravel. Я использую в своем проекте Laravel 5.8.

У меня есть схема:

Schema::create('statistics', function (Blueprint $table) {
    $table->bigIncrements('id');
    $table->bigInteger('company_id')->unsigned();
    $table->foreign('company_id')->references('id')->on('companies')->onDelete('cascade');
    $table->text('agent')->nullable();
    $table->date('date')->nullable();
    $table->ipAddress('ip');
    $table->bigInteger('user_id')->default(0);
    $table->bigInteger('quest_id')->default(0);
    $table->string('browser', 70)->nullable();
    $table->string('platform', 70)->nullable();
    $table->string('language', 12)->nullable();
    $table->engine = "InnoDB";
    $table->charset = 'utf8mb4';
    $table->collation = 'utf8mb4_unicode_ci';
});

Я получаю статистику из этой функции:

public function generateStatistics(string $dateFrom, string $dateTo, int $id)
{
    return Statistics::whereBetween('date', [$dateFrom, $dateTo])->where('user_id', $id)->get();
}

$statisticsTotal = $this->frontendRepository->generateStatistics($dateFrom, $dateTo, $request->user()->id);
$statisticsResultsTotal = [];

$period = CarbonPeriod::create($dateFromInput, '1 day', $dateToInput);
foreach ($period as $dt) {
    $date = $dt->format("Y-m-d");
    $count = 0;
    $count2 = 0;
    foreach ($statisticsTotal as $stat){
        if ($stat->date == $date){
            $count = $count + 1;
        }
    }
    array_push($statisticsResultsTotal, "$date|$count");
};

Этот код генерирует статистику. Это нормально работает. Теперь мне нужно сгенерировать уникальную статистику посещений. Уникальный = уникальный IP-адрес.

Как мне это сделать?

1 Ответ

2 голосов
/ 15 октября 2019

Если вы хотите продолжать использовать ту же логику, что и у вас, то будет достаточно простого groupBy .

Вы можете создать для него другую функцию, например:

public function generateUniqueStatistics(string $dateFrom, string $dateTo, int $id)
{
    return Statistics::whereBetween('date', [$dateFrom, $dateTo])->where('user_id', $id)->groupBy('ip')->get();
}

Таким образом, вы можете просто изменить вызов на:

$statisticsTotal = $this->frontendRepository->generateUniqueStatistics($dateFrom, $dateTo, $request->user()->id);

, и код отдыха будет работать с ним как в том же формате.

Обновление

Я подумал, что это очевидно, но для ясности, чтобы groupBy работал без столбцов select , вам нужно будет запустить mySql в нестрогом режиме. .

В вашем файле config/database.php вы найдете массив connections, в котором есть ключ mysql, установите его свойство strict как false.

Если вы не хотите этого делать и продолжаете использовать строгий mysql, просто дайте имя столбцам, которые вы хотите выбрать, и не включайте id, так как id здесь не важен при выборе группировки статистики по ip.

Так, например, скажем, вам нужно company_id и agent, вы можете сделать так:

return Statistics::whereBetween('date', [$dateFrom, $dateTo])->where('user_id', $id)->select('company_id','agent','ip')->groupBy('ip')->get();

Надеюсь, это поможет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...