2015-07-28 150 views
11

我需要检查一个表是否存在于数据库中。我目前正在开发使用Yii2。检查表是否存在

我的情况与this question有些不同,因为要检查的表不是(也不是)。

我已经试过(new \yii\db\Query())->select('*')->from($mysticTable)->exists());

,因为根据上述链接的问题,当被问及如果->exists()yii\db\Query()类尝试->queryScalar()以上抛出一个yii\db\Exception。毫无疑问,这种方法会检查结果集是否存在。

如何检查表是否存在?

回答

14

对于Yii2你可以使用:

$tableSchema = Yii::$app->db->schema->getTableSchema('tableName'); 

如果表不存在,它会返回null,所以你可以为自己的null检查返回值:

if ($tableSchema === null) { 
    // Table does not exist 
} 

你可以找到这个方法在官方文档here

+2

而对于yii1:使用'getTable'而不是'getTableSchema'。 –

0

好,你得到一个例外。简单地解析异常消息。你会得到一个非常非常特定的消息和SQL错误代码缺失的表。

这就是我在检查例如如果错误是由于某些可以恢复的东西造成的,请说出连接断开,而不是其他错误。

或者我发现许多人已经指出了获取这些信息的更直接的方法。

0

一个分拆@msfoster's answer让我更接近解决方案

/** 
* @param $tableName 
* @param $db string as config option of a database connection 
* @return bool table exists in schema 
*/ 
private function tableExists($tableName, $db = null) 
{ 
    if ($db) 
     $dbConnect = \Yii::$app->get($db); 
    else 
     $dbConnect = \Yii::$app->get('db'); 

    if (!($dbConnect instanceof \yii\db\Connection)) 
     throw new \yii\base\InvalidParamException; 

    return in_array($tableName, $dbConnect->schema->getTableNames()); 
} 

这也用于多个数据库。

+0

如果有人可以把这个放入yii2源代码。那会很好 – iGbanam

+0

你看到我的回答了吗?你可以用框架内置的方法来做到,不需要编写自己的方法来实现。 – arogachev

+0

@arogachev在Yii 2中没有这样简单的内置方法。而且,我有多个数据库,所以'Yii :: $ app-> db'是不够的。 – iGbanam