2015-07-28 25 views
11

Devo controllare se esiste una tabella in un database. Attualmente sto sviluppando usando Yii2.Tabella di controllo esistente

Il mio caso è leggermente diverso da this question perché la tabella da controllare non è (e non può essere) un modello.

ho cercato (new \yii\db\Query())->select('*')->from($mysticTable)->exists());

È possibile che questo getta un yii\db\Exception perché, secondo la domanda legata soprattutto, la classe yii\db\Query() cerca di ->queryScalar() quando gli viene chiesto se ->exists(). Invariabilmente, questo metodo controlla se esiste il set di risultati.

Come posso controllare se esiste una tabella?

risposta

14

Per Yii2 è possibile utilizzare:

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

Se la tabella non esiste, verrà restituito null, in modo da poter controllare il valore restituito per essere null:

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

È possibile trovare questo metodo nei documenti ufficiali here.

+2

E per yii1: utilizzare 'getTable' invece di' getTableSchema'. –

0

Bene, si ottiene un'eccezione. Semplicemente analizza il messaggio di eccezione. Riceverai un messaggio molto specifico e codice di errore SQL per la tabella mancante.

Questo è quello che faccio quando controllo ad es. Se un errore era dovuto a qualcosa che può essere recuperato, diciamo una connessione interrotta, rispetto ad altri errori.

O vedo che molte persone hanno indicato modi molto più diretti per ottenere tali informazioni.

0

uno spin off @msfoster's answer mi sono avvicinata ad una soluzione in

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

Questo serve anche più database.

+0

se qualcuno potrebbe inserire questo nella fonte yii2. sarebbe bello – iGbanam

+0

Hai visto la mia risposta? Puoi farlo con i metodi built-in di framework, senza bisogno di scrivere i propri metodi per ottenerlo. – arogachev

+0

@arogachev non ci sono metodi integrati così semplici in Yii 2. E, ho più database quindi 'Yii :: $ app-> db' non è sufficiente. – iGbanam