2015-07-28 201 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