Уникальные результаты из базы данных Laravel 5.8 - PullRequest
0 голосов
/ 14 октября 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->string('url_address', 160)->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();
    }

Эта функция возвращает все результаты изБаза данных для меня и работает правильно. Мне нужно повторить эту функцию, чтобы отобразить уникальные результаты. Уникальный результат = уникальный IP в выбранный день.

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

Ответы [ 2 ]

1 голос
/ 14 октября 2019

вам нужно добавить диктант ip

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

или вы можете группировать по ip

public function generateStatistics(string $dateFrom, string $dateTo, int $id)
{
    return Statistics::whereBetween('date', [$dateFrom, $dateTo])->where('user_id', $id)->groupBy('ip')->get();
}
0 голосов
/ 14 октября 2019

Что вы подразумеваете под уникальным? получить список различных IP-адресов в этом диапазоне? это было бы так:

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

РЕДАКТИРОВАТЬ: я увидел, что вам нужны не значения IP-адресов, а счетчик статистики.

Преобразование в MYSQL должно выглядеть примерно так (возможно, это поможет вам в вашем коде):

SELECT COUNT(id), ip
FROM statistics
WHERE user_id = {{id}} AND date BETWEEN {{dateFrom}} AND {{dateTo}}
GROUP BY ip;

Таким образом, будет возвращено количество запросов, сгруппированных по IP. Сумма всех подсчетов даст вам общую сумму запроса, а количество IP-адресов даст вам общую сумму уникального запроса.

На Laravel:

$requestPerIp = Statistics::whereBetween('date', [$dateFrom, $dateTo])
         ->where('user_id', $id)
         ->select('ip', DB::raw('count(*) as total'))
         ->groupBy('ip')
         ->get();

Для общего уникального запроса просто:

$numberOfUniqueRequest = count($requestPerIp);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...