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

时间:2016-08-27 03:55:34

标签: database laravel laravel-5 triggers laravel-migrations

这篇文章是为了通知并提出问题。 大家好,     我正在开发一个能够充分利用触发器的大型系统。我们目前正在使用phpmyadmin使用php 7在Laravel 5.2上运行服务器端。在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 :: unrepared()不允许您将绑定项附加到它。在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
         ');

1 个答案:

答案 0 :(得分:2)

除非我误解了您的问题,否则我认为您正在寻找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]);