2010-07-10 19 views
7

Bırakmadan önce bir tablonun varlığını kontrol etmeye çalışıyorum. Doctrine_Table için API belgelerini okudum ve böyle bir şey bulamıyorum. Kaybettiğim bir şey mi var?Bırakmadan önce tablo varlığını kontrol edin?

Ben görünüyor kodu var gibi:

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

$export = new Doctrine_Export(); 

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

Ve bir tablo yok ben almak hatadır:

Önemli hata: Özel durum yakalanmamış 'Doctrine_Connection_Mysql_Exception' iletisiyle ' sqlstate [42S02]: Taban tablo veya bulunmayan görünüm: 1051 Bilinmeyen tablo önceden

sayesinde

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

cevap

2

İşte kullanıyorum sarılır ne ... iyileştirilmesi için herhangi bir öneri bekliyoruz

DROP TABLE IF EXISTS ... 

Yerel SQL sorgularını Doctrine ile de çalıştırabilirsiniz.

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

(ama bu geçerlidir – lotsoffreetime

0

Ben taşınabilirlik test etmedim ama yerli SQL yapabileceğiniz:Casey

4

sadece tablo varsa doğru/yanlış dönmek istiyorsanız

, bu ne yaptım Ne arıyordum.) Öncelikle, basitçe dropTable() tarafından atılan Doctrine_Connection_Mysql_Exception (veya agnostisizm için ebeveynini) yakalayabilir ve eğer göründüyse hatayı görmezden gelebilirsiniz. İkincisi, yarattığınız Doctrine_Query'yi serbest() kullanmanız bellek sızıntısına neden olacaktır.
+0

İyi ve kısa öneri, bu oylama benim için geçerli. –

17

Doctrine2 yöntemidir: necromancy Maalesef

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

Bu şekilde çok sezgisel – manix

+0

Bu, bunu kontrol etmenin en basit ve en basit yoludur. Benim durumumda, Doctrine EntityManager aracılığıyla SchemaManager'a referans almak zorunda kaldım: $ em-> getConnection() -> getSchemaManager(); – spetz83