2010-07-10 4 views
7

Sto cercando di verificare l'esistenza di un tavolo prima di rilasciarlo. Ho letto la documentazione dell'API per Doctrine_Table e non riesco a trovare nulla di simile. C'è qualcosa che mi manca?Verifica la presenza del tavolo prima di rilasciarlo?

Ho codice simile:

$table = new Doctrine_Table('model_name', $conn); 

$export = new Doctrine_Export(); 

$export->dropTable($table->getTableName()); 

E l'errore che ottengo quando una tabella non esiste è:

Fatal error: eccezione Uncaught 'Doctrine_Connection_Mysql_Exception' con il messaggio ' SQLSTATE [42S02]: Base tavolo o vista non trovato: 1.051 Unknown tavolo

Grazie in anticipo,

Casey

risposta

2

Ecco cosa ho finito con l'utilizzo ... eventuali proposte di miglioramento sono i benvenuti:

public static function isInstalled() 
{ 
    $installed = true; 

    $q = Doctrine_Query::create($conn); 
    $q->select('t.id'); 
    $q->from('Table t'); //the table to check 

    try { 
     $q->execute(); 
    } catch (Doctrine_Connection_Exception $e) { 
     // we only want to silence 'no such table' errors 
     if ($e->getPortableCode() !== Doctrine_Core::ERR_NOSUCHTABLE) { 
      throw new Doctrine_Export_Exception($e->getMessage()); 
     } 

     $installed = false; 
    } 

    return $installed; 
} 
+1

(Ci scusiamo per l'necromanzia, ma questo è rilevante per quello che stavo cercando). In primo luogo, si poteva semplicemente aver rilevato Doctrine_Connection_Mysql_Exception (o il suo genitore, per agnosticismo) lanciato da dropTable() e ignorare l'errore se fosse apparso. In secondo luogo, non libero() l'uso di Doctrine_Query creato causerà una perdita di memoria. – lotsoffreetime

0

non ho ancora testato la portabilità, ma in SQL nativa si può fare:

DROP TABLE IF EXISTS ... 

È anche possibile eseguire query SQL native con Doctrine.

4

Se si desidera solo per restituire true/false se la tabella esiste, questo è quello che ho fatto:

public function checkTable($table) 
{ 
    $conn = Doctrine_Manager::connection(); 
    try { $conn->execute("DESC $table"); } 
    catch (Exception $e) { return false; } 
    return true; 
} 
+0

Buono e breve suggerimento, il mio voto vale per questo. –

17

metodo Doctrine2 è:

$schemaManager = $this->getDoctrine()->getConnection()->getSchemaManager(); 
if ($schemaManager->tablesExist(array('users')) == true) { 
     // table exists! ... 
} 
+1

Questo modo è molto intuitivo. – manix

+0

Questo è il modo più semplice e meno oneroso per controllarlo. Nel mio caso ho dovuto ottenere il riferimento allo SchemaManager tramite Doctrine EntityManager in questo modo: $ em-> getConnection() -> getSchemaManager(); – spetz83