Laravel 模型关系上的计算字段,如模型属性

Posted

技术标签:

【中文标题】Laravel 模型关系上的计算字段,如模型属性【英文标题】:Laravel computed field on the relation's of a model like a model attribute 【发布时间】:2020-07-24 08:00:08 【问题描述】:

我有一个Flights 的模型。 Flightpayments_log有关系。

payments_log 表中有两个字段:amounttype(Input/Output or add/sub)

我想在Flight 模型上添加一个字段,例如Total_amount

Flight 模型上的 total_amount 将是一个从 relationship 计算的字段。

type   amount
I       5.0
I       10.0
O       2

Total_amount = I+I-O = 13

最佳做法是什么?

【问题讨论】:

【参考方案1】:

在您的 Flight 模型上创建一个 accessor 方法,对日志表中的 amount 列求和:

public function getTotalAmountAttribute()

    // Sum log records of type I (add) 
    // and substract the sum of all log records of type ) (sub)
    return $this->paymentsLog()->where('type', 'I')->sum('amount') - $this->paymentsLog()->where('type', 'O')->sum('amount');

然后您可以使用以下方式访问它:

$flight->total_amount;

【讨论】:

谢谢,$this->payableLogs() 和 $this->payableLogs 有什么区别? $this->paymentsLog 返回相关payments_log 记录的集合(因为它执行查询),其中$this->payableLogs() 返回查询构建器实例。 当我们用 find(id) 选择时,有什么办法可以在模型集合上看到这个字段? 是的,将此属性添加到您的Flight 类:protected $appends = ['total_amount'];。这将确保它包含在每个飞行记录中。

以上是关于Laravel 模型关系上的计算字段,如模型属性的主要内容,如果未能解决你的问题,请参考以下文章

使用现有表模式上的数据透视表在雄辩模型中指定关系字段

用于 Laravel Nova 中同一模型上的两个资源字段的 relatableQuery()

Laravel - 按“字段及其关系模型字段”之间的条件过滤模型

Laravel Eloquent ORM 无法正确返回模型的关系

laravel--为什么属性在模型中没有定义,却取出来了值,这些属性哪里来的

Flutter Dart:模型类字段内的动态关系