2010-07-10 115 views
7

我想在删除它之前检查表的存在。我已经阅读了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未知表

由于提前,

凯西

回答

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; 
} 
+1

(对不起,我的巫但这是有关)首先,您可以简单地通过dropTable()引发Doctrine_Connection_Mysql_Exception(或其父为不可知论),并在出现错误时忽略该错误。其次,不免费()您创建的Doctrine_Query将导致内存泄漏。 – lotsoffreetime 2011-07-01 14:11:52

0

我没有测试过的便携性,但在本地SQL你可以这样做:

DROP TABLE IF EXISTS ... 

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

4

如果你只是想,如果表存在,返回真/假,这是我做的:

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

好的和短的建议,我的投票是为了这个。 – 2012-01-10 14:59:31

17

Doctrine2方法是:

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

这种方式非常直观 – manix 2014-05-19 02:38:50

+0

这是检查这一点的最简单和最不费钱的方式。在我的情况下,我必须通过Doctrine EntityManager获得对SchemaManager的引用,如下所示: $ em-> getConnection() - > getSchemaManager(); – spetz83 2014-06-25 14:15:43

相关问题