Проверить существование таблицы перед тем, как бросить? - PullRequest
8 голосов
/ 11 июля 2010

Я пытаюсь проверить наличие таблицы, прежде чем ее бросить.Я прочитал документацию по API для Doctrine_Table и не могу найти ничего подобного.Я что-то упускаю?

У меня есть код, который выглядит следующим образом:

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

$export = new Doctrine_Export();

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

И ошибка, которую я получаю, когда таблицы не существует:

Неустранимая ошибка: необработанное исключение «Doctrine_Connection_Mysql_Exception» с сообщением «SQLSTATE [42S02]: базовая таблица или представление не найдено: 1051 Неизвестная таблица

Заранее спасибо,

Кейси

Ответы [ 4 ]

22 голосов
/ 05 августа 2013

Метод Doctrine2:

$schemaManager = $this->getDoctrine()->getConnection()->getSchemaManager();
if ($schemaManager->tablesExist(array('users')) == true) {
      // table exists! ...
}
4 голосов
/ 05 октября 2011

Если вы просто хотите вернуть true / false, если таблица существует, я сделал следующее:

public function checkTable($table)
{
    $conn = Doctrine_Manager::connection();
    try { $conn->execute("DESC $table"); }
    catch (Exception $e) { return false; }
    return true;
}
2 голосов
/ 12 июля 2010

Вот что я использовал ... любые предложения по улучшению приветствуются:

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;
}
0 голосов
/ 12 июля 2010

Я не тестировал переносимость, но в нативном SQL вы можете сделать:

DROP TABLE IF EXISTS ...

Вы также можете запускать собственные запросы SQL с Doctrine.

...