2015-07-28 7 views
11

Ich muss überprüfen, ob eine Tabelle in einer Datenbank vorhanden ist. Ich entwickle derzeit mit Yii2.Prüftabelle existiert

Mein Fall ist ein bisschen anders als this question, weil die zu überprüfende Tabelle kein Modell ist (und nicht sein kann).

Ich habe versucht, (new \yii\db\Query())->select('*')->from($mysticTable)->exists());

Die oben wirft einen yii\db\Exception weil nach oben gestellte Frage verknüpft, die yii\db\Query() Klasse ->queryScalar() versucht, als wenn ->exists() gefragt. Diese Methode prüft immer, ob die Ergebnismenge existiert.

Wie überprüfe ich, ob eine Tabelle existiert?

Antwort

14

Für Yii2 können Sie:

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

Wenn die Tabelle nicht existiert, es null zurückkehren, so können Sie zurückgegebene Wert überprüfen null für sein:

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

du finden Methode in offiziellen Dokumenten here.

+2

Und für yii1: benutze 'getTable' anstelle von' getTableSchema'. –

0

Gut, dass Sie eine Ausnahme bekommen. Analysieren Sie einfach die Ausnahmebedingungsnachricht. Sie erhalten eine sehr sehr spezifische Nachricht und SQL-Fehlercode für fehlende Tabelle.

Das ist, was ich mache, wenn z. WENN ein Fehler auf etwas zurückzuführen ist, das wiederhergestellt werden kann, z. B. eine unterbrochene Verbindung, im Vergleich zu einem anderen Fehler.

ODER Ich sehe, dass viele Menschen viel direkter Wege aufgezeigt haben, diese Informationen zu bekommen.

0

Ein Spin-off @msfoster's answer hat mich in zu einer Lösung näher

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

Dies dient auch mehrere Datenbanken.

+0

wenn jemand könnte dies in die yii2 Quelle setzen. das wäre schön – iGbanam

+0

Hast du meine Antwort gesehen? Sie können es mit integrierten Framework-Methoden tun, keine Notwendigkeit, eigene Methoden zu schreiben, um das zu erreichen. – arogachev

+0

@arogachev gibt es keine so einfache eingebaute Methoden in Yii 2. Und ich habe mehrere Datenbanken, so 'Yii :: $ app-> db' ist nicht ausreichend. – iGbanam