Laravel Nova - Как вывести в трендах сумму за период
24.02.2021
81

Laravel Nova - Как вывести в трендах сумму за период

В Laravel Nova удобно отображать метрики через тренды. Создавая периоды можно получить информацию например о новых пользователях в системе. В одном проекте понадобилось вывести число, которое отображает сумму новых пользователей за выбранный период.


Изначально задача показалась тривиальной, которая не требует доработок. Достаточно добавить метод showLatestValue(), но метод отображает только последнее значение из полученных за период.



Тренды наследуют "Laravel\Nova\Metrics\Trend" в котором присутствует метод result():

    /**
     * Create a new trend metric result.
     *
     * @param  string|null  $value
     * @return \Laravel\Nova\Metrics\TrendResult
     */
    public function result($value = null)
    {
        return new TrendResult($value);
    }


Метод возвращает новый экземпляр класса "\Laravel\Nova\Metrics\TrendResult" в котором размещен нужный нам метод showLatestValue() возвращающий последнее значение из массива. Нам его нужно переопределить для суммирования значения массива.


Создадим кастомный TrendResult: \app\Nova\Metrics\CustomTrendResult.php:

namespace App\Nova\Metrics;

use Laravel\Nova\Metrics\TrendResult as NovaTrendResult;

class CustomTrendResult extends NovaTrendResult
{
    /**
     * Set the latest value of the trend as the primary result.
     *
     * @return CustomTrendResult
     */
    public function showLatestValue()
    {
        if (is_array($this->trend)) {
            return $this->result(array_sum($this->trend));
        }

        return $this;
    }
}


В нужном тренде заменим метод result, который вернет нам кастомный объект TrendResult:

namespace App\Nova\Metrics;

use App\Models\User;
use App\Nova\Metrics\CustomTrendResult;
use Illuminate\Http\Request;
use Laravel\Nova\Metrics\Trend;

class NewUsersTrend extends Trend
{
    /**
     * The displayable name of the metric.
     *
     * @var string
     */
    public $name = 'New users';

    /**
     * Create a new trend metric result.
     *
     * @param  string|null  $value
     * @return CustomTrendResult
     */
    public function result($value = null)
    {
        return new CustomTrendResult($value);
    }

    /**
     * Calculate the value of the metric.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return mixed
     */
    public function calculate(Request $request)
    {
        return $this->countByDays($request, User::class)
            ->showLatestValue()
            ->format('0,0');
    }


В результате мы получили сумму новых пользователей.

Источник: ZetRider
Bash деплой - аналог Envoyer
24.02.2021
100
Bash деплой - аналог Envoyer

Для быстрого деплоя личных или простых проектов можно использовать сервисы подобные Envoyer.io о котором писал ранее или написать свой велосипед на ba...

Читать →
reCaptcha v2 для Laravel
21.02.2021
106
reCaptcha v2 для Laravel

Для защиты форм от спама полезно добавлять всем надоевшую reCaptcha от Google, которая существенно позволяет сократить количество сообщений от ботов н...

Читать →
Envoyer - деплой без задержек
26.01.2021
97
Envoyer - деплой без задержек

Zero Downtime PHP Deployment - способ развернуть сервис незаметно для посетителей.Во времена развития CI/CD на фоне инструментов GitLab, BitBucket, Tr...

Читать →