承接 gsebastiao/laravel-model-audit 相关项目开发

从需求分析到上线部署,全程专人跟进,保证项目质量与交付效率

邮箱:yvsm@zunyunkeji.com | QQ:316430983 | 微信:yvsm316

gsebastiao/laravel-model-audit

Composer 安装命令:

composer require gsebastiao/laravel-model-audit

包简介

BaseModel for Laravel 11–13 with Eloquent-first CRUD, audit logging, batch operations, resolve maps and bulk updates.

README 文档

README

BaseModel para Laravel 11, 12 e 13 com CRUD Eloquent-first, auditoria automática, operações em lote e bulk update.

Instalação

composer require gsebastiao/laravel-model-audit
php artisan vendor:publish --tag=model-audit-migrations
php artisan migrate

Publicar config (opcional):

php artisan vendor:publish --tag=model-audit-config

Criar um Model

php artisan make:audit-model Produto --table=produtos --soft-deletes

Ou manualmente:

use CodeBuilder\BaseModel\BaseModel;

class Produto extends BaseModel
{
    protected $table = 'produtos';
    protected $fillable = ['nome', 'preco', 'categoria_id'];

    public function getResolveMap(): array
    {
        return [
            'categoria_id' => self::getResolveMap(label: 'Categoria', table: 'categorias', column: 'nome'),
            'ativo'        => self::getResolveMap(type: 'alias', label: 'Situação'),
        ];
    }
}

CRUD

Insert

// Simples
$id = Produto::insertData(['nome' => 'Cadeira', 'preco' => 150.00]);

// Com resolveMap para auditoria legível
$id = Produto::insertData([
    'data'       => ['nome' => 'Cadeira', 'categoria_id' => 3],
    'resolveMap' => Produto::getResolveMap(label: 'Categoria', table: 'categorias', column: 'nome'),
]);

Update (Eloquent — respeita timestamps, mutators e eventos)

// Por ID
Produto::updateData(5, ['preco' => 200.00]);

// Por condições
Produto::updateData(['ativo' => 0], ['preco' => 0]);

Bulk Update (Query Builder — 1 query, sem mutators)

// Atualiza milhares de registos numa única query
// updated_at é gerido automaticamente
Produto::bulkUpdate(['categoria_id' => 3], ['ativo' => 0]);
updateData bulkUpdate
Eloquent events
Mutators
updated_at automático ✅ (manual)
Performance (N registos) N queries 1 query

Delete

Produto::deleteData(5);              // soft delete
Produto::deleteData(5, purge: true); // delete permanente
Produto::deleteData(['ativo' => 0]); // por condição

Update or Insert

$result = Produto::updateOrInsert(
    conditions: ['sku' => 'ABC-001'],
    data: ['nome' => 'Cadeira Pro', 'preco' => 299.00]
);
// ['action' => 'inserted'|'updated', 'id' => 12]

Operações em Lote

updateDataBatch

Produto::updateDataBatch([
    ['conditions' => ['id' => 1], 'data' => ['preco' => 100]],
    ['conditions' => ['id' => 2], 'data' => ['preco' => 200]],
]);

deleteDataBatch

Produto::deleteDataBatch([
    ['categoria_id' => 1, 'ativo' => 0],
    ['categoria_id' => 2, 'ativo' => 0],
]);

upsertData

Produto::upsertData(
    dataBatch:    [['data' => ['sku' => 'A1', 'preco' => 10]], ...],
    uniqueFields: ['sku'],
);

Auditoria

Todas as operações são auditadas automaticamente na tabela app_tables_audits.

// Desativar pontualmente
Produto::disableAudit();
Produto::updateData(5, ['preco' => 0]);
Produto::enableAudit();

// Tabela de auditoria personalizada
Produto::setAuditTable('minha_tabela_audits');

// Consultar auditoria de um registo
$audit = Produto::audits('produtos', ['id' => 5, 'page' => 1, 'limit' => 10]);

ResolveMap — tipos disponíveis

// direct — busca label numa tabela (FK)
'user_id' => self::getResolveMap(label: 'Usuário', table: 'users', column: 'name')

// direct com scope — filtra por campo adicional
'status_code' => self::getResolveMap(
    label:  'Status',
    table:  'app_tables_status',
    key:    'code',
    column: 'name',
    scope:  ['table_name' => 'produtos'],
)

// join — resolve via tabelas intermediárias
'estado_id' => self::getResolveMap(
    type:  'join',
    joins: [
        ['table' => 'estados', 'key' => 'id'],
        ['table' => 'paises', 'on' => ['paises.id', '=', 'estados.pais_id'], 'column' => 'nome', 'label' => 'País'],
    ],
)

// alias — renomeia o campo sem tocar no banco
'ativo' => self::getResolveMap(type: 'alias', label: 'Situação')

Gerador de Código Sequencial

$codigo = Produto::generate(
    table:    'produtos',
    column:   'codigo',
    template: '{prefix}-{year}-{number}',
    placeholders: ['{prefix}' => 'PROD'],
);
// → 'PROD-2025-001'

Config (config/model-audit.php)

Chave Padrão Descrição
audit_table app_tables_audits Tabela de auditoria
auto_audit true Auditoria automática
audit_required true Falha na auditoria faz rollback
soft_deletes true Soft deletes por padrão
bulk_driver query_builder Driver do bulkUpdate

Compatibilidade

Laravel PHP Suporte
11.x 8.2+
12.x 8.2+
13.x 8.2+

Licença

MIT

统计信息

  • 总下载量: 0
  • 月度下载量: 0
  • 日度下载量: 0
  • 收藏数: 0
  • 点击次数: 1
  • 依赖项目数: 0
  • 推荐数: 0

GitHub 信息

  • Stars: 0
  • Watchers: 0
  • Forks: 0
  • 开发语言: PHP

其他信息

  • 授权协议: MIT
  • 更新时间: 2026-07-03

承接程序开发

PHP开发

VUE

Vue开发

前端开发

小程序开发

公众号开发

系统定制

数据库设计

云部署

网站建设

安全加固