我试图重命名MySQL数据库中的某些列,但不幸的是,该表包含enum
,因此doctrine\dbal
会引发错误。我决定使用原始sql编写自己的重命名功能,但我实施的一些检查失败了,我不知道为什么。
当我在MySQL CLI中时,我运行此查询:
select table_name from information_schema where table_name = "my_table" and table_schema = "my_schema";
这将返回包含表名的一行,如预期的那样。所以我想在我的迁移中,我可以做到这一点:
$exists = Schema::hasTable('my_table');
但是返回false
。很奇怪,我想,所以让我们把整个Schema
的事情从等式中解脱出来,然后直接尝试对information_schema
。
$result = DB::select('select table_name from information_schema where table_name = ? and table_schema = ?', ['my_table', 'my_schema']);
但是,当我运行该语句时,$result
的值为[]
。我想也许编译后的sql可能是错误的,所以我dump
编辑了DB::getQueryLog()
的回复,但看起来都是正确的:
array:1 [
0 => array:3 [
"query" => "select table_name from information_schema.tables where table_name = ? and table_schema = ?;"
"bindings" => array:2 [
0 => "my_table"
1 => "my_schema"
]
"time" => 0.01
]
]
我应该指出,当我运行php artisan tinker
并运行相同的DB::select()
声明时,我会得到我正在寻找的结果,所以它似乎无法正常工作就在迁移文件中。
我不知所措。为什么DB::select()
会返回与在MySQL CLI上运行完全相同的查询不同的结果?
答案 0 :(得分:0)
Plz使用DB:raw('select table_name from information_schema where table_name =“my_table”and table_schema =“my_schema”');
答案 1 :(得分:0)
我目前有一个解决方法。我在config/database.php
文件中创建了第二个相同的连接配置文件,其连接信息与my_schema
相同,只是我将database
更改为information_schema
。在我的迁移中,我使用以下内容:
DB::connection('my_informationschema')->select('select table_name from information_schema where table_name = ? and table_schema = ?', ['my_table', 'my_schema']);
这就是我需要的东西。因此,在使用原始查询时,应用程序似乎可以让您快速松散地使用模式,除非您正在进行迁移?