2010-07-10 9 views
7

J'essaie de vérifier l'existence d'une table avant de la déposer. J'ai lu la documentation de l'API pour Doctrine_Table et je n'arrive pas à trouver quelque chose comme ça. Y a-t-il quelque chose qui me manque?Vérifiez l'existence de la table avant de la déposer?

J'ai eu un code qui ressemble à:

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

$export = new Doctrine_Export(); 

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

Et l'erreur que je reçois quand une table n'existe pas est:

Erreur fatale: Uncaught exception 'Doctrine_Connection_Mysql_Exception' message ' SQLSTATE [42S02]: table de base ou vue non trouvée: 1051 une table inconnue

de Merci à l'avance,

Casey

Répondre

2

Voici ce que je blesse à l'aide ... des suggestions d'amélioration sont les bienvenus:

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

(Désolé pour la nécromancie, mais cela est pertinent à ce que je cherchais.) Premièrement, vous pourriez simplement avoir intercepté l'exception Doctrine_Connection_Mysql_Exception (ou son parent, pour l'agnosticisme) par dropTable() et ignorer l'erreur si elle était apparue. Deuxièmement, ne pas libérer() la Doctrine_Query que vous avez créée provoquera une fuite de mémoire. – lotsoffreetime

0

Je n'ai pas testé la portabilité, mais dans SQL natif que vous pouvez faire:

DROP TABLE IF EXISTS ... 

Vous pouvez également exécuter des requêtes SQL natives avec Doctrine.

4

Si vous voulez juste retourner true/false si la table existe, ce que je l'ai fait:

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

Bonne et courte suggestion, mon vote va pour celui-ci. –

17

méthode Doctrine2 est:

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

Cette méthode est très intuitive – manix

+0

C'est la façon la plus simple et la moins éprouvante de vérifier cela. Dans mon cas, je devais obtenir la référence au SchemaManager via le Doctrine EntityManager comme ceci: $ em-> getConnection() -> getSchemaManager(); – spetz83