#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) ]
)