Тенденция метрики Laravel Nova в будущем

#laravel #laravel-nova

#laravel #laravel-nova

Вопрос:

Я застрял, я хочу создать тенденцию показателей Laravel Nova, где она идет в будущем, а не назад во времени.

Этот код выведет: 15 марта 2019 года, 14 марта2019 года, 13 марта2019 года,

 public function calculate(Request $request)
{
    return $this->sumByDays($request, Payment::class, 'hours_per_month', 'upcoming_invoice_date')->showLatestValue();
}

/**
 * Get the ranges available for the metric.
 *
 * @return array
 */
public function ranges()
{
    return [
        3 =>  '3 Days',
    ];
}
  

Я уже внес некоторые изменения в Trend.php но это не дало мне ничего, кроме ошибок.

     /**
 * Return a value result showing a sum aggregate over days.
 *
 * @param  IlluminateHttpRequest  $request
 * @param  IlluminateDatabaseEloquentBuilder|string  $model
 * @param  string  $column
 * @param  string  $dateColumn
 * @return LaravelNovaMetricsTrendResult
 */
public function sumByDays($request, $model, $column, $dateColumn = null)
{
    return $this->aggregate($request, $model, Trend::BY_DAYS, 'sum', $column, $dateColumn);
}
  

Возможно ли это вообще?

Спасибо,

Ответ №1:

Диапазон тренда определяется в Trend.php итак, вы были на правильном пути!

Ознакомьтесь с агрегатом защищенных функций.

 protected function aggregate($request, $model, $unit, $function, $column, $dateColumn = null)
    {
  

$ endingDate можно изменить на все, что вы хотите!

         $possibleDateResults = $this->getAllPossibleDateResults(
            $startingDate = $this->getAggregateStartingDate($request, $unit),
            $endingDate = Chronos::now();
  

У Chronos API есть хорошая документация, но попробуйте что-то вроде этого

 $endingDate = Chronos::tomorrow()->addWeeks(4),
  

Примечание: Я провел очень минимальное тестирование этого, поэтому используйте на свой страх и риск. Это нарушает метод showLatestValue () для метрик тренда, но это можно было бы решить в TrendResult.php если вам это действительно было нужно.

Ответ №2:

1) Вы можете изменить диапазон дат на будущее с отрицательным числом (дней) в качестве ключа:

 public function ranges()
{
    return [
        -3 =>  'Next 3 Days',
    ];
}
  

Проблема в том, что это не работает, потому что порядок datetimes в запросе будет неправильным, поскольку конечная дата всегда устанавливается в now () в Trend.php:

 $startingDate = $this->getAggregateStartingDate($request, $unit),
$endingDate = Chronos::now(),
...
->whereBetween($dateColumn, [$startingDate, $endingDate])
  

2) Быстрое / грязное исправление. В Trend.php измените массив второго аргумента whereBetween() (для datetimes), сравнивая и устанавливая datetimes в порядке возрастания.

 ->whereBetween(
    $dateColumn, 
    [ min($startingDate, $endingDate), max($startingDate, $endingDate) ]
)