如何在简单的 CRUD laravel 中执行简单的审计跟踪

Posted

技术标签:

【中文标题】如何在简单的 CRUD laravel 中执行简单的审计跟踪【英文标题】:How to perform simple audit trail in simple CRUD laravel 【发布时间】:2018-11-22 14:45:38 【问题描述】:

如何使用 laravel 中的 (updated_at) 时间戳获取最后一个更新表单的人的用户名,最好的逻辑或方法是什么?只能在刀片中使用吗?还是我需要将代码放在我的控制器中?

示例: 更新时间:2018 年 6 月 13 日 更新人:用户名

目前我只能通过在刀片中使用此代码来获取更新日期

Updated: date('d-M-Y', strtotime($leads->updated_at))

【问题讨论】:

你需要使用数据库。 看看很棒的 github.com/VentureCraft/revisionable 包。 【参考方案1】:

您的数据库表中需要这两列:updated_atlast_updated_by

在您的控制器中,当您更新该记录时,在last_updated_by 字段中添加正在更新该记录的用户的 ID。

注意:这将仅显示用户 ID 的最后更新。

如果你想存储每个 updated_by 然后创建一个新表:

   table:  update_timeline

   postid : user_id : updated_date 

现在您可以对这两个表使用连接查询,并根据需要获取每个表的更新。

【讨论】:

感谢您的回复,我找到了答案,嘿嘿,我找到了一个包名 laravel auding laravel-auditing.com 谢谢您的回答..【参考方案2】:

数据库表

CREATE TABLE `leads` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
  `created_at` timestamp NULL DEFAULT NULL,
  `updated_at` timestamp NULL DEFAULT NULL,
  PRIMARY KEY (`id`),
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE `lead_history` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `lead_id` int(11) unsigned DEFAULT NULL,
  `updated_by` int(11) unsigned DEFAULT NULL,
  `created_at` timestamp NULL DEFAULT NULL,
  `updated_at` timestamp NULL DEFAULT NULL,
  PRIMARY KEY (`id`),
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

型号

class Lead extends Model 

    public function history()
    
        return $this->hasMany(LeadHistory::class,'lead_id');
    


class LeadHistory extends Model

    public function lead()
    
        return $this->belongsTo(Lead::class);
    

    public function user()
    
        return $this->belongsTo(User::class, 'updated_by');
    

现在获取线索

$leads = Lead::all(); //for demo purpose, always use pagination based results or fetch with condition

这里是模板渲染

@foreach ($leads as $lead)
    <p>This is your lead:  $lead->name </p>
      @if ($lead->history)
        <label>Lead Updated By:</label>
        <ul>
           @foreach ($lead->history as $history)
              <li>$history->user->username</li>
            @endforeach
        </ul>
      @endif
 @endforeach

假设您有带有“用户名”字段的用户表

每当用户更新潜在客户时,您只需在潜在客户历史记录表中插入一条记录,在 updated_by 字段中使用该 userId

【讨论】:

感谢您的回复我找到了答案嘿嘿我找到了一个包名 laravel auding laravel-auditing.com 谢谢您的回答..【参考方案3】:

您可以将模型更改存储在单独的模型中,例如 Activity。该模型可能与模型、执行活动的用户的外键以及操作类型(即createupdatedelete)具有多态关系。

然后您可以创建一个应用于模型的特征,该特征会在每次创建、更新或删除模型时自动创建活动记录:

trait Auditable

    public static function bootAuditable()
    
        static::created(function ($model) 
            $model->recordActivity('create');
        );

        static::updated(function ($model) 
            $model->recordActivity('update');
        );

        static::deleted(function ($model) 
            $model->recordActivity('delete');
        );
    

    protected function recordActivity($operation)
    
        $activity = new Activity([
            'operation' => $operation,
            'user_id' => Auth::id(),
        ]);

        $activity->model()->associate($this);

        $activity->save();
    

然后您将能够粗略地列出模型的操作,即

    用户 1 创建了模型 1 用户 2 更新了模型 1 用户 1 创建了模型 2 用户 1 已删除模型 1

……等等。

【讨论】:

感谢您的回复,我找到了答案,嘿嘿,我找到了一个包名 laravel auding laravel-auditing.com 谢谢您的回答..【参考方案4】:

我为 created_by、updated_by 审计跟踪创建了一个包。你可以在https://github.com/insenseanalytics/laravel-user-audit-trails查看它

【讨论】:

以上是关于如何在简单的 CRUD laravel 中执行简单的审计跟踪的主要内容,如果未能解决你的问题,请参考以下文章

如何在 laravel php 中使用 ajax 根据日期范围从 mysql 数据库中检索数据?

laravel用crud修改产品items-新建resource controller和routing

Laravel 5.4:无法在视图中显示 crud 内容

如何使用 Laravel 5.3 创建 REST 完整 Web 服务的 Api

Mybatis 框架学习—— 简单CRUD的实现

如何使用 vue axios 在 laravel 中解决 401 未授权响应