有没有办法检测Laravel是否存在数据库表


87

我希望能够使用创建表

Schema::create('mytable',function($table)
{
    $table->increments('id');
    $table->string('title');
});

但在此之前,我想检查表是否已经存在,也许像

Schema::exists('mytable');

但是,以上功能不存在。我还能使用什么?


您能否告诉您添加此代码的文件?
亚西尔·穆萨

Answers:


218

如果您使用的是Laravel 4或5,那么hasTable()您可以在L4源代码L5文档中找到该方法:

Schema::hasTable('mytable');

call_user_func_array() expects parameter 1 to be a valid callback, class 'Illuminate\Database\MySqlConnection' does not have a method 'hasTable',我用DB::hasTable('test')是因为找不到Schema类。
151291年

10
尝试DB :: connection('xxxx')-> getSchemaBuilder()-> hasTable('xxx')
最终

我尝试了这个,它正在起作用……DB::getSchemaBuilder()->hasTable('table_name_without_prefix')
Syamsoul Azrien

架构:: connection(“ bio_db”)-> hasTable('deviceLogs_11_2019')
pankaj kumar

23

要创建一个新表,只能通过Laravel Schema函数进行一次检查hasTable

if (!Schema::hasTable('table_name')) {
    // Code to create table
}

但是,如果要在检查任何表之前删除任何表,则Schema具有一个称为的函数dropIfExists

Schema::dropIfExists('table_name');

如果存在表,它将删除表。


4

如果您使用的是其他连接,则必须接受我的回答。

Schema::connection("bio_db")->hasTable('deviceLogs_11_2019')

hasTable()函数上,您可以传递多个表名。


3

L3中没有为此内置的功能。您可以执行原始查询:

$table = "foo";
$check = DB::only('SELECT COUNT(*) as `exists`
    FROM information_schema.tables
    WHERE table_name IN (?)
    AND table_schema = database()',$table);
if(!$check) // No table found, safe to create it.
{
    // Schema::create …
}

1
!谢谢..我使用Laravel 3
伊赫桑Zargar Ershadi

这在数据库类型之间不是完全交叉兼容的。例如,它不适用于Sqlite或Oracle。
Benubird

0

而是依赖于信息模式查询,而不是使用来检查表中的某些数据COUNT()

SELECT table_schema 
FROM information_schema.tables
WHERE table_schema = DATABASE()
      AND table_name = 'table_name';

改变你的'table_name'价值。

如果输出一行,则表示该表存在。


0

正如Phill Sparks回答的那样,您可以使用以下方法检查表是否存在:

Schema::hasTable('mytable')

请注意,在某些情况下,您的应用程序使用不同的连接。在这种情况下,您应该使用:

Schema::connection('myConnection')->hasTable('mytable')

(不要忘记use Schema;在代码的开头使用)。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.