caneara/triggers

此包已废弃,不再维护。未建议替代包。

为Laravel添加数据库触发器支持的包

v1.0.1 2022-09-20 07:05 UTC

This package is auto-updated.

Last update: 2024-04-04 14:43:01 UTC


README

此包允许在Laravel应用程序中使用数据库触发器。请注意,您选择的数据库必须支持触发器,以便该包能够工作。

安装

使用Composer引入包

composer require caneara/triggers

用法

只能将触发器添加到现有表中。因此,在您的迁移文件中创建触发器时,请确保在Schema::create方法之后添加它们。

要创建一个触发器,只需在Triggers\Trigger类上调用table方法

use Triggers\Trigger;

Trigger::table('posts');

默认情况下,该类将根据以下约定为触发器生成名称

trigger_{TABLE}_{TIME}_{EVENT}

然而,由于触发器名称必须在数据库中是唯一的,如果您要创建两个使用相同事件和时间的触发器(这些概念将在下一节中介绍),则会出现错误。

为了解决这个问题,该类提供了一个key方法,允许您向触发器的名称中添加自己的自定义文本,从而确保触发器名称可以唯一

Trigger::table('posts')->key('custom');

当指定了键时,触发器名称将从以下约定派生

trigger_{TABLE}_{KEY}_{TIME}_{EVENT}

事件和时间

接下来,您需要指定触发器应该在INSERTUPDATEDELETE事件时触发。您还需要指定触发器应该在事件发生后BEFOREAFTER执行

Trigger::table('posts')->beforeDelete();
Trigger::table('posts')->beforeInsert();
Trigger::table('posts')->beforeUpdate();

Trigger::table('posts')->afterDelete();
Trigger::table('posts')->afterInsert();
Trigger::table('posts')->afterUpdate();

语句

最后一步是指定当触发器被触发时应执行的SQL语句。为此,向事件/时间方法提供一个Closure。请注意,Closure必须返回一个SQL string,例如

Trigger::table('posts')->afterInsert(function() {
    return "UPDATE `users` SET `posts` = 1 WHERE `id` = NEW.user_id;";
});

示例

以下示例显示了创建一个posts表并将其分配给触发器的迁移。

use Triggers\Trigger;

class CreatePostsTable extends Migration
{
    public function up() : void
    {
        Schema::create('posts', function(Blueprint $table) {
            $table->unsignedTinyInteger('id');
            $table->string('title');
        });

        Trigger::table('posts')->key('count')->afterInsert(function() {
            return "UPDATE `users` SET `posts` = 1 WHERE `id` = NEW.user_id;";
        });
    }
}

贡献

感谢您考虑为此项目做出贡献。您欢迎提交包含改进的PR,但如果它们本质上是重大的,请确保还包括测试或测试。

许可

MIT许可(MIT)。有关更多信息,请参阅许可文件