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

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
Вывод Builder SQL запроса с переданными значениями
09.11.2021
155
Вывод Builder SQL запроса с переданными значениями

Для анализа SQL запросов в Laravel из коробки присутствует метод toSql класса \Illuminate\Database\Eloquent\Builder. Но данный метод возвращает п...

Читать →
Laravel Nova: Множественные поля
28.10.2021
183
Laravel Nova: Множественные поля

Множественные поля для Laravel Nova основаны на хранении данных в json формате свойства модели.GitHubУстановка:composer require zetrider/nova-inputs-f...

Читать →
Тестирование и отладка роутов Laravel при помощи DebugBar
09.10.2021
212
Тестирование и отладка роутов Laravel при помощи DebugBar

Для тестирования роутов на наличие дубликата sql запросов, потребления памяти или времени загрузки можно использовать удобный интерфейс laravel-debugb...

Читать →