检查表存在

时间:2015-07-28 08:28:00

标签: php mysql yii2 dao

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

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

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

以上内容会引发yii\db\Exception,因为根据上面提到的问题,yii\db\Query()班级会在被问到->queryScalar()时尝试->exists()。这个方法总是会检查结果集是否存在。

如何检查表格是否存在?

3 个答案:

答案 0 :(得分:19)

对于Yii2,您可以使用:

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

如果该表不存在,它将返回null,因此您可以检查返回值为null

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

您可以在官方文档here中找到此方法。

答案 1 :(得分:0)

很好,你得到一个例外。只需解析异常消息即可。您将获得一个非常非常具体的消息和缺少表的SQL错误代码。

这是我在检查时所做的事情,例如如果错误是由于可以恢复的东西,比如连接断开,而不是其他错误。

或者我看到许多人已经指出了更直接的方式来获取这些信息。

答案 2 :(得分: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());
}

这也服务于多个数据库。