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

标签 php mysql laravel laravel-migrations

我有一个 Laravel 项目,该项目已经有一个带有 SQL 脚本的数据库,并且我正在尝试将 MySQL 脚本放入迁移中以使用 Eloquent。我的数据库有使用 DELIMITER $$ 的触发器,并根据此 question ,看起来我无法在脚本中使用 DELIMITER $$ 因为它是 MySQL 客户端命令,而 MySQL PDO 无法使用 PHP 访问它。

有没有办法避免 DELIMITER $$ 但在 MySQL 触发器中仍然有条件,使其可用于 Laravel 数据库迁移?

迁移.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 ;

最佳答案

注意虽然此解决方案在 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
)

关于php - 如何为 Laravel 迁移创建带条件且不带分隔符的 MySQL 触发器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51814303/

相关文章:

PHP 文件上传不起作用,注意输出到浏览器

php - 获取用户点击我们链接的网站的 url

php - MySQL 5.5 大小写不正确的语法

php - 如何使用 laravel 5.1 使用更新记录的 user_id 填充 modded_by ?

php - 返回表中每条记录的平均值

php - Laravel - 如何清除数组语言的缓存

php - 使用 PHP 进行代码注入(inject)

php - htaccess 404 在添加尾部斜杠时无法正常工作

mysql - 如何使用具有特定值的 order by

php - Mysql extractvalue 函数从 xml 内容中检索 xml 片段