[英]How to create a MySQL trigger with condition and without delimiter for Laravel migration?
我有一個Laravel項目,該項目已經有一個帶有SQL腳本的數據庫,並且我試圖將MySQL腳本放入遷移中以使用Eloquent。 我的數據庫具有使用DELIMITER $$
觸發器,根據此問題 ,我似乎無法在腳本中使用DELIMITER $$
,因為這是MySQL客戶端命令,而MySQL PDO無法使用PHP對其進行訪問。
有沒有一種方法可以避免DELIMITER $$
但在MySQL觸發器中仍具有條件,以使其可用於Laravel數據庫遷移?
migration.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
)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.