Laravel Eloquent 中的 Audit belongsTo 关系

Posted

技术标签:

【中文标题】Laravel Eloquent 中的 Audit belongsTo 关系【英文标题】:Audit belongsTo relationship in Laravel Eloquent 【发布时间】:2018-08-06 20:24:17 【问题描述】:

我有一个模型“Contract”和一个模型“ContractLine”,它们处于经典的主从关系中。在 Laravel 术语中:契约线与契约有一个 belongsTo 关系。我想审核用户对其合同所做的所有更改。不仅是一般“合同”表中的更改,还有基础“合同行”中的更改/添加/删除。

我查看了 owen-it 的 laravel-auditing 和 csinghdev 的 cs-revisionable,但我不确定他们是否支持这种审计。

任何帮助表示赞赏。

【问题讨论】:

【参考方案1】:

我通过使用laravel-auditing 解决了我的问题,用合同的 id 标记了我的 ContractLine(使用 generateTags)并将方法“getAllAudits”添加到我的合同模型中。此方法连接 Contract 审计及其基础 ContractLine 审计。在我的审计演示中,我检查了每个审计的“auditable_type”字段,以区分合同审计和合同线审计。

仍然感觉有点 hacky,原生解决方案会更好。

【讨论】:

您好,如果您将Contract和ContractLine的示例模型代码放在答案中会很有帮助。 嘿,你能给出一些示例代码示例吗?谢谢【参考方案2】:

我可以为Laravel Auditing发言。

确实可以审计多个表(即 Eloquent 模型)。

为此,您必须在ContractContractLine 模型中实现Auditable 接口。

基本上是这样的:

<?php
namespace App;

use Illuminate\Database\Eloquent\Model;
use OwenIt\Auditing\Contracts\Auditable;

class Contract extends Model implements Auditable

    use \OwenIt\Auditing\Auditable;

    // ...

ContractLine 模型应用相同的内容。

查看documentation 的主要部分,其中解释了所有内容,包括使用软件包时的常见问题。

【讨论】:

谢谢。正如您在我自己的回答中看到的那样,我就是这样做的,但在我的 Contract 模型中添加了一个 getAllAudits 方法,以在一个大集合中检索对我的 Contract 的审计以及对其基础 ContractLines 的审计。 是的,当我写完我的答案时,我看到你自己回答了。不过,我不太明白标签的使用究竟是如何解决您的问题的。那我觉得我可能误解了你原来的问题。 我也有同样的问题。给定上面的例子,如果我想做 $contract->revisionTo($last_revision) 和它的所有关系,上面的例子会起作用吗,还是我需要手动做? @QuetzyGarcia 此答案已过期

以上是关于Laravel Eloquent 中的 Audit belongsTo 关系的主要内容,如果未能解决你的问题,请参考以下文章

laravel eloquent 中的一对多关系

使用 eloquent 截断 laravel 中的所有表

如何从 Laravel 8 Eloquent 中的嵌套关​​系中获取数据?

通过 eloquent 更新 laravel 中的多行

Laravel ELOQUENT 问题中的 DISTINCT

Laravel 4 中的 Eloquent 调用:处理多个表中的单个列