10

我试图在删除表之前检查它是否存在。我已经阅读了 Doctrine_Table 的 API 文档,但我似乎找不到这样的东西。有什么我想念的吗?

我的代码看起来像:

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

$export = new Doctrine_Export();

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

当表不存在时我得到的错误是:

致命错误:未捕获异常 'Doctrine_Connection_Mysql_Exception' 并带有消息 'SQLSTATE[42S02]:未找到基表或视图:1051 未知表

提前致谢,

凯西

4

5 回答 5

29

Doctrine2 方法是:

$schemaManager = $this->getDoctrine()->getConnection()->getSchemaManager();
if ($schemaManager->tablesExist(array('users')) == true) {
      // table exists! ...
}
于 2013-08-05T07:12:00.560 回答
6

如果您只想在表存在时返回真/假,这就是我所做的:

public function checkTable($table)
{
    $conn = Doctrine_Manager::connection();
    try { $conn->execute("DESC $table"); }
    catch (Exception $e) { return false; }
    return true;
}
于 2011-10-05T00:50:24.393 回答
2

这是我最终使用的……欢迎提出任何改进建议:

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;
}
于 2010-07-11T23:41:13.643 回答
0

我没有测试可移植性,但在本机 SQL 中你可以这样做:

DROP TABLE IF EXISTS ...

您也可以使用 Doctrine 运行本机 SQL 查询。

于 2010-07-12T19:11:55.063 回答
0

试试这个表存在检查:

 public function up(Schema $schema): void
{
    $schema->hasTable('table_name');
}

对于列检查:

$schema->getTable('supply')->hasColumn('contracts')

带有跳过的完整示例:

$this->skipIf($schema->getTable('supply')->hasColumn('contracts'), 'Table order_statuses already exist');
于 2021-11-23T07:28:13.460 回答