我正在使用Laravel迁移来创建/管理我的所有数据库脚本,并且我有一个用于创建触发器的迁移。
这是
DB::unprepared(
'create trigger update_points_aft_insert
after insert on votes
for each row
begin
declare u_id integer;
if NEW.votable_type = "App\\Comment" then
set u_id = (select user_id from comments where id = NEW.votable_id);
update users set points=points+NEW.vote where id = u_id;
end if;
end;'
);
问题是当我运行show triggers;
时,我得到了:
*************************** 1. row ***************************
Trigger: update_points_aft_insert
Event: INSERT
Table: votes
Statement: begin
declare u_id integer;
if NEW.votable_type = "AppComment" then
set u_id = (select user_id from comments where id = NEW.votable_id);
update users set points=points+NEW.vote where id = u_id;
end if;
end
Timing: AFTER
Created: NULL
sql_mode: NO_ENGINE_SUBSTITUTION
Definer: root@localhost
character_set_client:utf8 collation_connection:utf8_unicode_ci 数据库整理:latin1_swedish_ci
正如您所看到的,mysql读取的内容是if NEW.votable_type = "AppComment" then
而不是我想要的内容:if NEW.votable_type = "App\Comment" then
...
有谁知道我怎么能告诉mysql读反斜杠?
编辑:有效的是使用三个反斜杠
答案 0 :(得分:1)
要考虑反斜杠,你应该加倍。因此," App \\\\ Comment"应该给你" App \ Comment"
答案 1 :(得分:0)
if NEW.votable_type = "App\\\Comment" then
有效。我相信你需要两个的原因是因为mysql需要一个反斜杠而laravel需要一个。根据mysql documentation \\
将打印\
。但我想,发生的事情是Laravel逃脱了第一次反斜杠而mysql逃脱了第二次。所以你需要3。