{"id":19055575,"url":"https://github.com/chance-fyi/operation-log","last_synced_at":"2025-04-24T04:27:56.441Z","repository":{"id":61225638,"uuid":"437779941","full_name":"Chance-fyi/operation-log","owner":"Chance-fyi","description":"自动为数据库的增删改操作生成可读的操作日志","archived":false,"fork":false,"pushed_at":"2023-12-26T08:33:55.000Z","size":208,"stargazers_count":31,"open_issues_count":0,"forks_count":5,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-04-14T10:53:09.060Z","etag":null,"topics":["hyperform","laravel-orm","log","operation-log","thinkphp-orm"],"latest_commit_sha":null,"homepage":"","language":"PHP","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Chance-fyi.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null}},"created_at":"2021-12-13T07:44:16.000Z","updated_at":"2024-10-29T03:59:35.000Z","dependencies_parsed_at":"2023-12-26T09:58:15.005Z","dependency_job_id":null,"html_url":"https://github.com/Chance-fyi/operation-log","commit_stats":null,"previous_names":[],"tags_count":26,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Chance-fyi%2Foperation-log","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Chance-fyi%2Foperation-log/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Chance-fyi%2Foperation-log/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Chance-fyi%2Foperation-log/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Chance-fyi","download_url":"https://codeload.github.com/Chance-fyi/operation-log/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":250563086,"owners_count":21450770,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["hyperform","laravel-orm","log","operation-log","thinkphp-orm"],"created_at":"2024-11-08T23:46:10.958Z","updated_at":"2025-04-24T04:27:56.400Z","avatar_url":"https://github.com/Chance-fyi.png","language":"PHP","funding_links":[],"categories":[],"sub_categories":[],"readme":"支持 Laravel 的 ORM 、Hyperf 的 ORM 与 ThinkPHP 的 ORM 。可以生成增、删、改，包括批量增、删、改，以及 使用 DB 操作的日志。\n\n通过~~模型事件~~与获取器，自动生成可读性高的操作日志。2.0 版本已弃用模型事件，因为批量操作没有触发模型事件，使用模型事件无法覆盖所有模型对数据库的操作以及 DB 操作。\n\n### 安装\n\n\u003e composer require chance-fyi/operation-log\n\n### 注意\n\n\u003e 因为使用了单例，所以在常驻内存的框架中使用一定要在每次请求结束之后将生成的日志清空。\n\n### 使用 Laravel 的 ORM\n\n首先在数据库的配置文件 `config/database.php` 中增加两个配置项 `modelNamespace` 和 `logKey`。\n\n```php\n\u003c?php\n\nreturn [\n    'default' =\u003e env('DB_CONNECTION', 'mysql'),\n    ...\n    'connections' =\u003e [\n        'mysql' =\u003e [\n            'driver' =\u003e 'mysql',\n            'url' =\u003e env('DATABASE_URL'),\n            'host' =\u003e env('DB_HOST', '127.0.0.1'),\n            'port' =\u003e env('DB_PORT', '3306'),\n            'database' =\u003e env('DB_DATABASE', 'forge'),\n            'username' =\u003e env('DB_USERNAME', 'forge'),\n            'password' =\u003e env('DB_PASSWORD', ''),\n            ...\n            ...\n            // 模型所在的命名空间\n            \"modelNamespace\" =\u003e \"Chance\\Log\\Test\\model\",\n            // 日志记录的主键\n            \"logKey\" =\u003e \"id\",\n        ],\n        ...\n    ]\n    ...\n];\n```\n\n然后注册 MySQL 数据库连接的解析器。\n\n```php\n\\Illuminate\\Database\\Connection::resolverFor('mysql', function ($connection, $database, $prefix, $config) {\n    return new \\Chance\\Log\\orm\\illuminate\\MySqlConnection($connection, $database, $prefix, $config);\n});\n```\n\n### 使用 ThinkPHP 的 ORM\n\n在数据库的配置文件 config/database.php 中增加三个配置项 `query`、`modelNamespace` 和 `logKey`，并修改 `type` 与 `builder`。\n\n```php\n\u003c?php\n\nreturn [\n    'default'         =\u003e env('database.driver', 'mysql'),\n    ...\n    'connections'     =\u003e [\n        'mysql' =\u003e [\n            // 服务器地址\n            'hostname'        =\u003e env('database.hostname', '127.0.0.1'),\n            // 数据库名\n            'database'        =\u003e env('database.database', ''),\n            // 用户名\n            'username'        =\u003e env('database.username', 'root'),\n            // 密码\n            'password'        =\u003e env('database.password', ''),\n            // 端口\n            'hostport'        =\u003e env('database.hostport', '3306'),\n            ...\n            ...\n            // 数据库类型\n            'type'            =\u003e \\Chance\\Log\\orm\\think\\MySqlConnection::class,\n            // 指定查询对象\n            \"query\"           =\u003e \\Chance\\Log\\orm\\think\\Query::class,\n            // Builder类\n            \"builder\"         =\u003e \\think\\db\\builder\\Mysql::class,\n            // 模型所在的命名空间\n            \"modelNamespace\"  =\u003e \"Chance\\Log\\Test\\model\",\n            // 日志记录的主键\n            \"logKey\"          =\u003e \"id\",\n        ],\n        // 更多的数据库配置信息\n        ...\n    ],\n    ...\n];\n```\n\n### 日志主键\n\n可在模型中设置`$logKey`属性修改需要记录的主键名称。\n\n```php\n\u003c?php\n\nnamespace Chance\\Log\\Test\\model;\n\nclass User extends BaseModel\n{\n    // 日志记录的主键名称\n    public string $logKey = 'id';\n}\n```\n\n### 可读性设置\n\n通过表注释、字段注释与获取器来生成可读性的日志。\n\n**表注释与字段注释**\n\n![image-20220309172842186](https://image.chance.fyi/image-20220309172842186.png)\n\n也可以在模型中通过`$tableComment`与`$columnComment`设置表注释与字段注释。\n\n```php\n\u003c?php\n\nnamespace Chance\\Log\\Test\\model;\n\nclass User extends BaseModel\n{\n    // 表注释\n    public $tableComment = '用户';\n    // 字段注释\n    public $columnComment = [\n        'name' =\u003e '姓名',\n        'sex' =\u003e '性别',\n    ];\n}\n```\n\n**获取器**\n\n设置一个名为`字段名_text`的获取器。\n\n```php\n\u003c?php\n\nnamespace Chance\\Log\\Test\\model;\n\nclass User extends BaseModel\n{\n    // Laravel ORM 获取器设置方法\n    public function getSexTextAttribute($key): string\n    {\n        return ['女','男'][($key ?? $this-\u003esex)] ?? '未知';\n    }\n\n    // ThinkPHP ORM 获取器设置方法\n    public function getSexTextAttr($key): string\n    {\n        return ['女','男'][($key ?? $this-\u003esex)] ?? '未知';\n    }\n}\n```\n\n### 日志生成忽略的字段\n\n可在模型中通过 `$ignoreLogFields` 设置该表不希望生成日志的字段。\n\n```php\n\u003c?php\n\nnamespace Chance\\Log\\Test\\model;\n\nclass User extends BaseModel\n{\n    // 日志生成忽略的字段\n    public $ignoreLogFields = [\n        'create_time',\n        'update_time',\n    ];\n}\n```\n\n### 数据表不生成日志\n\n可在模型中通过 `$doNotRecordLog` 设置该表不在生成日志。\n\n```php\n\u003c?php\n\nnamespace Chance\\Log\\Test\\model;\n\nclass User extends BaseModel\n{\n    // 不生成该表的日志\n    public $doNotRecordLog = true;\n}\n```\n\n### 表模型映射关系\n\n如果模型文件名与表名不相同，将查找不到表所对应的模型。也就无法完成上面一些，需要在模型中设置的功能。所以可以设置一个表与模型的映射关系，来帮助查找表所对应的模型。\n\n如果是在 ThinkPHP、Laravel、webman 框架中使用，可使用 `php vendor/bin/chance-fyi-operation-log 模型所在目录` 命令来自动构建所选目录中递归查找到的所有模型与表的映射关系。如果命令执行失败，也可选择手动维护映射关系，并通过以下方法手动注入表模型映射关系。\n\n```php\n\\Chance\\Log\\facades\\OperationLog::setTableModelMapping([\n    \"database1\" =\u003e [\n        \"table1\" =\u003e \"app\\\\model\\\\Table1\",\n        \"table2\" =\u003e \"app\\\\model\\\\Table2\",\n    ],\n    \"database2\" =\u003e [],\n]);\n```\n\n### 获取日志信息\n\n```php\n\\Chance\\Log\\facades\\OperationLog::getLog();\n```\n\n### 清除日志信息\n\n```php\n\\Chance\\Log\\facades\\OperationLog::clearLog();\n```\n\n### 启用禁用\n\n```php\n# 启用 (默认)\n\\Chance\\Log\\facades\\OperationLog::enable();\n# 禁用\n\\Chance\\Log\\facades\\OperationLog::disable();\n```\n\n### 效果图\n\n![image](https://user-images.githubusercontent.com/37658940/215932487-9c923053-1bdb-4198-a13e-3ca7d668d65c.png)\n\n![image](https://user-images.githubusercontent.com/37658940/215932628-ee02d2d4-b1a0-4fac-a53c-2eda2858c9bc.png)\n\n![image](https://user-images.githubusercontent.com/37658940/215932685-64cf39f3-6ac1-44c1-af29-abc7c078228c.png)\n\n![image](https://user-images.githubusercontent.com/37658940/215932722-99d7ad4b-01d6-4ddc-b47d-9d213c16022e.png)\n\n![image](https://user-images.githubusercontent.com/37658940/215932756-b8a88945-1732-4272-a843-eaf20aea528e.png)\n\n![image](https://user-images.githubusercontent.com/37658940/215932790-b93f54af-7a3e-4098-8765-8821d5d4fcb1.png)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fchance-fyi%2Foperation-log","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fchance-fyi%2Foperation-log","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fchance-fyi%2Foperation-log/lists"}