甜曼CC / mysql-trigger-for-laravel-migration

一个用于将数据库触发器添加到Laravel迁移的包

dev-master 2021-05-07 15:41 UTC

This package is auto-updated.

Last update: 2024-09-07 18:18:22 UTC


README

Software License Build Status StyleCI

Laravel数据库触发器提供了一种向Laravel迁移添加数据库触发器的方法,就像添加数据库表一样。触发器是与表关联的命名数据库对象,当表发生特定事件时,它会激活。有关触发器的更多信息,请参阅这里

安装

Laravel数据库触发器需要至少PHP 7.2。这个特定版本至少支持Laravel v6.0。该包目前仅支持MySQL。

要获取最新版本,请使用Composer安装该包。

$ composer require sweetmancc/mysql-trigger-for-laravel-migration

安装后,如果您不使用自动包发现,则需要将Sweetmancc\DatabaseTrigger\TriggerServiceProvider服务提供者注册到您的config/app.php中。

使用

使用make:trigger artisan命令创建触发器迁移文件。该命令需要触发器的名称、事件对象表名称、动作时间和激活触发器的事件。

$ php artisan make:trigger after_users_posts_insert

事件对象表

事件对象表是触发器关联的表名称。

动作时间

触发器的激活时间。可能的值是afterbefore

after - 在事件对象表上的更改完成后处理动作。

before - 在事件对象表上的更改之前处理动作。

事件

激活触发器的事件。触发器事件可以是insertupdatedelete

insert - 在事件对象表上执行插入操作时激活触发器。

update - 在事件对象表上执行更新操作时激活触发器。

delete - 在事件对象表上执行删除操作时激活触发器。

以下触发器迁移文件将生成一个名为after_users_posts_insert的触发器,事件对象表名称为user_posts,动作时间为after,事件为insert

use Illuminate\Database\Migrations\Migration;
use Sweetmancc\DatabaseTrigger\TriggerFacade as Schema;

class CreateAfterUsersUpdateTrigger extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('after_users_posts_insert')
            ->on('user_posts')
            ->statement(function() {
                return '//You logic, Don't forget ";" ';
            })
            ->after()
            ->update();
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('users.after_users_posts_insert');
    }
}

statement方法的闭包中返回触发语句。

以下是一个示例触发器迁移,用于在更新用户行后向users_audit表插入数据。

...

    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('after_user_posts_insert')
            ->on('user_posts')
            ->statement(function() {
                //It means that when insert an row into user_posts table It will inrease 1 to user_profiles table where row record user_id same as NEW insert to user_posts table user_id field.
                return 'UPDATE user_profiles SET postCount = postCount + 1 WHERE id = NEW.user_id;';
            })
            ->after()
            ->update();
    }

...

更新数据库迁移

php artisan migrate

我的MySQL数据库表 user_postsuser_profiles

CREATE TABLE `user_posts` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `created_at` timestamp NULL DEFAULT NULL,
  `updated_at` timestamp NULL DEFAULT NULL,
  `user_id` bigint(20) unsigned NOT NULL,
  `text` text COLLATE utf8mb4_unicode_ci,
  PRIMARY KEY (`id`),
  KEY `user_posts_user_id_foreign` (`user_id`),
  CONSTRAINT `user_posts_user_id_foreign` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=17 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE `user_profiles` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `user_id` bigint(20) unsigned NOT NULL,
  `postCount` int(11) NOT NULL DEFAULT '0',
  `created_at` timestamp NULL DEFAULT NULL,
  `updated_at` timestamp NULL DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `user_profiles_user_id_unique` (`user_id`),
  CONSTRAINT `user_profiles_user_id_foreign` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

测试

使用以下命令运行测试

$ composer test

变更日志

有关最近更改的更多信息,请参阅变更日志

贡献

有关详细信息,请参阅贡献指南

安全

如果您在此包中发现安全漏洞,请将电子邮件发送至Andy Q:sweetmancc@gmail.com。所有安全漏洞都将得到及时处理。

许可协议

Laravel 数据库触发器遵循 MIT 许可证 (MIT)