10
votes

Vérifiez l'existence de table avant de tomber?

J'essaie de vérifier l'existence d'une table avant de le laisser tomber. 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?

J'ai un code qui ressemble à: xxx

et l'erreur que je reçois lorsqu'une table n'existe pas: < / p>

Erreur fatale: Exception non capturée 'doctrine_connection_mysql_exception' avec message 'sqlstate [42S02]: table de base ou vue non trouvée: 1051 Table inconnue

Merci d'avance,

Casey


0 commentaires

4 Réponses :


2
votes

Voici ce que j'ai fini avec ... Toute suggestion d'amélioration est la bienvenue:

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 commentaires

(Désolé pour la nécromancie, mais cela est pertinent pour ce que je cherchais.) Tout d'abord, vous pourriez simplement avoir attrapé la doctrine_connection_mysql_exception (ou son parent, pour l'agnosticisme), jeté par goutte droptable () et ignorez l'erreur si elle était apparue. Deuxièmement, pas libres () La doctrine_quête que vous avez créée provoquera une fuite de mémoire.



0
votes

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

DROP TABLE IF EXISTS ...


0 commentaires

6
votes

Si vous voulez juste retourner vrai / faux si la table existe, c'est ce que j'ai fait: xxx


0 commentaires

27
votes

La méthode doctrine2 est la suivante: xxx


2 commentaires

De cette façon est très intuitive


C'est la manière la plus simple et la moins taxe de vérifier cela. Dans mon cas, je devais avoir la référence au schemamanager à travers la doctrine EntityManager comme: $ em-> getconnection () -> getschemaManager ();