2015-07-28 21 views
11

Muszę sprawdzić, czy tabela istnieje w bazie danych. Obecnie rozwijam się przy użyciu Yii2.Tabela sprawdzająca istnieje

Mój przypadek jest nieco inny niż this question, ponieważ sprawdzana tabela nie jest (i nie może być) modelem.

Próbowałem (new \yii\db\Query())->select('*')->from($mysticTable)->exists());

Powyższy rzuca yii\db\Exception ponieważ według kwestii związanej powyżej, klasa yii\db\Query() próbuje ->queryScalar() pytany czy ->exists(). Niezmiennie ta metoda sprawdza, czy zestaw wyników istnieje.

Jak sprawdzić, czy tabela istnieje?

Odpowiedz

14

Dla Yii2 można użyć:

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

Jeśli tabela nie istnieje, zwróci null, więc można sprawdzić zwracaną wartość do bycia null:

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

Zdobedziesz metoda w oficjalnych dokumentach here.

+2

I dla yii1: użyj 'getTable' zamiast' getTableSchema'. –

0

Dobrze, że masz wyjątek. Po prostu przeanalizuj komunikat wyjątku. Otrzymasz bardzo bardzo szczegółowy komunikat i kod błędu SQL dla brakującej tabeli.

To właśnie robię podczas sprawdzania, np. JEŻELI błąd był spowodowany przez coś, co można odzyskać, powiedzmy, zerwane połączenie, w porównaniu do innego błędu.

LUB Widzę, że wiele osób wskazało znacznie bardziej bezpośrednie sposoby uzyskiwania tych informacji.

0

Spin off @msfoster's answer dostał mnie bliżej do rozwiązania, w

/** 
* @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()); 
} 

Służy również wielu baz danych.

+0

, jeśli ktoś mógłby umieścić to w źródle yii2. to byłoby miłe. – iGbanam

+0

Widziałeś moją odpowiedź? Można to zrobić za pomocą wbudowanych metod ramowych, nie trzeba pisać własnych metod, aby to osiągnąć. – arogachev

+0

@arogachev nie ma takich prostych wbudowanych metod w Yii 2. Mam też wiele baz danych, więc 'Yii :: $ app-> db' nie jest wystarczające. – iGbanam