代码之家  ›  专栏  ›  技术社区  ›  MathieuAuclair

如何为Laravel迁移创建带条件且不带分隔符的MySQL触发器?

  •  0
  • MathieuAuclair  · 技术社区  · 8 年前

    DELIMITER $$ 根据这个 question ,看起来我不能用 分隔符$$ 在我的脚本中,因为它是一个MySQL客户端命令,MySQL PDO不能通过PHP访问它。

    有没有办法避免 分隔符$$

    迁移.php:

    <?php
    
    use Illuminate\Database\Migrations\Migration;
    use Illuminate\Support\Facades\DB;
    use Illuminate\Support\Facades\File;
    use Illuminate\Support\Facades\Log;
    
    class RunInitScriptSql extends Migration
    {
        /**
         * Run the migrations.
         *
         * @return void
         */
         public function up()
         {
            $sql_dump = File::get(base_path("database/billing_system_stable.sql"));
            $sql_dump_insert = File::get(base_path("database/billing_system_insertions.sql"));
            $sql_dump_trigger = File::get(base_path("/database/billing_system_triggers.sql"));
    
            DB::connection('mysql')->getPdo()->exec("CREATE DATABASE IF NOT EXISTS billing_system;");
            DB::connection('mysql')->getPdo()->exec(
                $sql_dump .
                $sql_dump_insert .
                $sql_dump_trigger
            );
        }
    
        /**
         * Reverse the migrations.
         *
         * @return void
         */
        public function down()
        {
    
        }
    }
    

    示例触发器:

    DROP TRIGGER IF EXISTS before_update_typesoumission;
    DELIMITER $$
    CREATE TRIGGER before_update_typesoumission
      BEFORE UPDATE
      ON typesoumission
      FOR EACH ROW
        IF NEW.typeSoumission = 'Résidentiel'
        THEN
          SET NEW.ratio = 1;
        ELSE
          SET NEW.ratio =
          NEW.tauxHoraire / (SELECT tauxHoraire
                             FROM typesoumission
                             WHERE typeSoumission = 'Résidentiel');
        END IF;
    $$
    DELIMITER ;
    
    1 回复  |  直到 8 年前
        1
  •  1
  •   Nick SamSmith1986    8 年前

    注意 虽然这个解决方案在MySQL上运行良好,但是OP使用的MariaDB似乎并不喜欢它。

    你应该可以把 CREATE TRIGGER 变成一个疑问。在我的情况下我用 $link $link = new PDO("mysql:host=$server;dbname=$db;charset=utf8", $user, $pass, $options); )作为我的连接。我正在运行PHP7和MySQL5.6:

    $link->exec("DROP TRIGGER IF EXISTS before_update_typesoumission");
    $link->exec("CREATE TRIGGER before_update_typesoumission
      BEFORE UPDATE
      ON typesoumission
      FOR EACH ROW
        IF NEW.typeSoumission = 'Résidentiel'
        THEN
          SET NEW.ratio = 1;
        ELSE
          SET NEW.ratio =
          NEW.tauxHoraire / (SELECT tauxHoraire
                             FROM typesoumission
                             WHERE typeSoumission = 'Résidentiel');
        END IF;");
    $result = $link->query("SELECT * FROM INFORMATION_SCHEMA.TRIGGERS WHERE TRIGGER_NAME='before_update_typesoumission'");
    print_r($result->fetch());
    

    Array
    (
        [TRIGGER_CATALOG] => def
        [TRIGGER_SCHEMA] => test
        [TRIGGER_NAME] => before_update_typesoumission
        [EVENT_MANIPULATION] => UPDATE
        [EVENT_OBJECT_CATALOG] => def
        [EVENT_OBJECT_SCHEMA] => test
        [EVENT_OBJECT_TABLE] => typesoumission
        [ACTION_ORDER] => 0
        [ACTION_CONDITION] => 
        [ACTION_STATEMENT] => IF NEW.typeSoumission = 'Résidentiel'
        THEN
          SET NEW.ratio = 1;
        ELSE
          SET NEW.ratio =
          NEW.tauxHoraire / (SELECT tauxHoraire
                             FROM typesoumission
                             WHERE typeSoumission = 'Résidentiel');
        END IF
        [ACTION_ORIENTATION] => ROW
        [ACTION_TIMING] => BEFORE
        [ACTION_REFERENCE_OLD_TABLE] => 
        [ACTION_REFERENCE_NEW_TABLE] => 
        [ACTION_REFERENCE_OLD_ROW] => OLD
        [ACTION_REFERENCE_NEW_ROW] => NEW
        [CREATED] => 
        [SQL_MODE] => STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
        [DEFINER] => test@10.1.10.0/255.255.255.0
        [CHARACTER_SET_CLIENT] => utf8
        [COLLATION_CONNECTION] => utf8_general_ci
        [DATABASE_COLLATION] => utf8_general_ci
    )
    
    推荐文章