2010-07-10 11 views
7

Estoy tratando de verificar la existencia de una tabla antes de descartarla. He leído la documentación de API para Doctrine_Table y parece que no puedo encontrar nada como esto. ¿Se me escapa algo?Verifica la existencia de la mesa antes de soltarla?

Tengo código que se parece a:

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

$export = new Doctrine_Export(); 

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

Y el error que consigo cuando no existe una tabla es:

Fatal error: Excepción no detectada 'Doctrine_Connection_Mysql_Exception' con el mensaje ' SQLSTATE [42S02]: tabla base o punto de vista no encontrado: 1051 tabla desconocida

Gracias de antemano,

Casey

Respuesta

2

Esto es lo que terminé usando ... alguna sugerencia de mejora son bienvenidos:

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

(Lo siento por la nigromancia, pero esto es relevante a lo que estaba buscando.) En primer lugar, simplemente podría haber capturado Doctrine_Connection_Mysql_Exception (o su padre, por agnosticismo) lanzado por dropTable() e ignorar el error si hubiera aparecido. En segundo lugar, no liberar() la Doctrine_Query que creó provocará una pérdida de memoria. – lotsoffreetime

0

no han probado la portabilidad, pero en SQL nativo que puede hacer:

DROP TABLE IF EXISTS ... 

También puede ejecutar consultas SQL nativas con Doctrine.

4

Si lo que desea es volver verdadero/falso si existe la tabla, esto es lo que hice:

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

Sugerencia buena y breve, mi voto va para este. –

17

método Doctrine2 es:

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

Esta forma es muy intuitiva – manix

+0

Esta es la manera más sencilla y menos costosa de verificar esto. En mi caso, tuve que obtener la referencia a SchemaManager a través de Doctrine EntityManager como lo siguiente: $ em-> getConnection() -> getSchemaManager(); – spetz83

Cuestiones relacionadas