Laravel 5.x 数据库触发器和可能的最佳实践

Posted

技术标签:

【中文标题】Laravel 5.x 数据库触发器和可能的最佳实践【英文标题】:Laravel 5.x Database Triggers and possible best practices 【发布时间】:2017-01-03 18:37:33 【问题描述】:

这篇文章是为了通知和提问。 大家好, 我正在开发一个可以很好地使用触发器的大型系统。我们目前使用 phpmyadmin 在 Laravel 5.2 和 php 7 上运行服务器端。在 Laravel 中,关于如何通过迁移使用触发器的可靠文档并不多,而且我发现您大多必须“原始”地进行操作。

下面是一个我知道的关于如何在迁移中编写触发器的简单示例:

class CreateAccountTriggerTable extends Migration

    /**
     * Run the migrations.
     *
     * @return void
     */
     public function up() 
        
         DB::unprepared('
             CREATE TRIGGER `my_trigger_name` AFTER INSERT ON `table_the_change_happened`
             FOR EACH ROW 

             BEGIN

             INSERT INTO `this_table`
                  (field1,field2,field3)
             VALUES
                  ('value1','value2','value3')

             END
         ');
     

     /**
      * Reverse the migrations.
      *
      * @return void
      */
     public function down() 
          DB::unprepared('DROP TRIGGER IF EXISTS `my_trigger_name`');
     
 

问题: 有谁知道在 laravel 的查询构建器中使用变量的干净方法?

方法 DB::unprepared() 不允许您将绑定的项目附加到它。在 Eloquent 中尝试它几乎是不可能的,因为我没有为这个问题找到可靠的文档。如果有人能详细说明这一点,我将不胜感激。提前谢谢你

更新 这里的每个请求都是我在 laravel 的查询构建器中使用变量的意思的一个例子:

          $stuff = bcrypt($random_numbers);
          DB::unprepared('
             CREATE TRIGGER `my_trigger_name` AFTER INSERT ON `table_the_change_happened`
             FOR EACH ROW 

             BEGIN

             INSERT INTO `this_table`
                  (field1,field2,field3)
             VALUES
                  ('value1','value2','value3',"$stuff")

             END
         ');

【问题讨论】:

你能举例说明“在 laravel 的查询构建器中使用变量”是什么意思吗? @patricus 确定!请查看更新的编辑 这是 Laravel 的 Model Events 拥有的应用程序之一。当您只需将模型附加到table_the_change_happened 然后在public function boot() parent::boot(); ); 中添加逻辑以在parent::boot() 之后进行插入时,就不需要触发器来执行此操作 如果您要跨多个表进行超过 50-80 个不同的插入,那么在流程方面真的会很有效吗?可以理解,我的问题中绘制的图像是一个简单的用例,但是在实际应用程序中,使用触发器(帐户设置)更有效。据我了解,处理这样的过程通常被视为使用触发器进行大型初始记录设置的好习惯。尽管这是一个完全不同的讨论。 【参考方案1】:

除非我误解了您的问题,否则我认为您正在寻找 statement() 方法,而不是 unprepared() 方法。 statement() 方法接受一个查询和该查询的参数绑定数组。

示例如下。值列表中的? 是查询参数。绑定到该参数的值被添加到第二个参数中传递给statement() 方法的数组中。

$stuff = bcrypt($random_numbers);
DB::statement('
        CREATE TRIGGER `my_trigger_name` AFTER INSERT ON `table_the_change_happened`
        FOR EACH ROW 

        BEGIN

        INSERT INTO `this_table`
            (field1,field2,field3)
        VALUES
            ('value1','value2','value3',?)

        END
    ', [$stuff]);

【讨论】:

我觉得它很接近,但是语句方法阻止了触发器的完全创建。我认为这是因为它需要在某个时候采取行动。 我给了你一个 +1,因为它让我朝着正确的方向前进。我感谢您帮助朝着正确的方向前进!以下是我的回答。

以上是关于Laravel 5.x 数据库触发器和可能的最佳实践的主要内容,如果未能解决你的问题,请参考以下文章

最佳实践:使用 PHP 5.x 将 CSV 导入 MYSQL 数据库

php laravel 和 stripe 在特定时间自动触发付款

在Laravel / Vue.js项目中共享静态/配置数据的最佳方法是什么

OctoberCMS (Laravel) + Vue.js + Tailwind CSS 最佳设置

Angular、Laravel 4 和 MySQL 数据库最佳实践

在 Laravel 中查询这个的最佳方法