在 Laravel Nova 中使用带有指标的模型(资源)属性(访问器)

Use a model (resource) attribute (accessor) with metrics in Laravel Nova

我有一个名为 purchases 的 MySQL table 和一个与它相关的 Laravel 中名为 Purchase 的模型。我的 table 有两列,quantityunit_cost。我的 table 中没有购买总费用的列。相反,它由 Laravel 中的访问器定义,它将 unit_cost 乘以 quantity 和 returns 将其乘以 total_cost.

现在我试图在 Laravel nova 中定义一个趋势指标,它应该输出我在选定范围内的每日销售额值。当我尝试使用 return $this->sumByDays($request, Purchase::class, 'total_cost') 时,它给我一个错误,提示 total_cost 不是列。

很公平!因此,我尝试在第二个参数中使用 Purchase::selectRaw(DB::RAW('unit_cost * quantity AS total_cost')),但没有用。我看到了多个帖子,其中 none 个可以解决 Laravel Nova 指标中访问模型访问器的问题。感谢任何帮助。

很遗憾,您不能使用内置的 sumByDays 辅助函数。

不过好消息!您仍然可以在 calculate 函数中自己实现它。只要确保你的函数 returns a Laravel\Nova\Metrics\TrendResult.

像这样:

$purchases = DB::table('purchases')
    ->select(DB::raw('quantity * unit_cost as total_cost'))
    ->groupBy(DB::raw('DATE(created_at) DESC'))
    ->get();

return new TrendResult()
    ->trend($purchases);

我现在没有时间测试这个,但它应该能让你入门。

在尝试解决此问题时,我检查了按天或按小时计算的总和代码,发现该列是查询表达式的一个实例。

这意味着您仍然可以按天数使用内置的 nova 总和。

确保导入 use Illuminate\Database\Query\Expression;

就这样做

$xpression = new Expression('quantity * unit_cost');
return $this->sumByDays($request, Purchase::class, $xpression);

它很适合我,我希望它也适合其他人。

表达式可以多种方式使用,在我的例子中是执行不同的计算。