2010-07-10 27 views
7

Tôi đang cố kiểm tra sự tồn tại của một bảng trước khi thả nó xuống. Tôi đã đọc qua tài liệu API cho Doctrine_Table và dường như tôi không thể tìm thấy bất cứ thứ gì như thế này. Có cái gì tôi đang mất tích?Kiểm tra bảng tồn tại trước khi thả?

Tôi đã có mã mà trông giống như:

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

$export = new Doctrine_Export(); 

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

Và lỗi tôi nhận được khi một bảng không tồn tại là:

Fatal error: của router ngoại lệ 'Doctrine_Connection_Mysql_Exception' với thông điệp ' SQLSTATE [42S02]: bảng cơ sở hoặc xem không tìm thấy: Unknown 1051 bảng

Cảm ơn trước,

Casey

Trả lời

2

Dưới đây là những gì tôi vết thương bằng cách sử dụng ... bất cứ đề nghị để cải thiện được chào đón:

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

(Xin lỗi vì sự chiêu hồn nhưng điều này là có liên quan Trước tiên, bạn có thể đơn giản đã bắt được Doctrine_Connection_Mysql_Exception (hoặc cha mẹ của nó, cho thuyết bất khả tri) được ném bởi dropTable() và bỏ qua lỗi nếu nó đã xuất hiện. Thứ hai, không miễn phí() vào Doctrine_Query mà bạn tạo ra sẽ gây rò rỉ bộ nhớ. – lotsoffreetime

0

tôi đã không kiểm tra tính di động, nhưng trong SQL mẹ đẻ bạn có thể làm:

DROP TABLE IF EXISTS ... 

Bạn cũng có thể chạy các truy vấn SQL tự nhiên với Doctrine.

4

Nếu bạn chỉ muốn trở về đúng/sai nếu bảng tồn tại, đây là những gì tôi đã làm:

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

Đề xuất tốt và ngắn, phiếu bầu của tôi sẽ được dùng cho mục này. –

17

phương pháp Doctrine2 là:

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

Cách này rất trực quan – manix

+0

Đây là cách đơn giản nhất và ít thuế nhất để kiểm tra điều này. Trong trường hợp của tôi, tôi đã nhận được tham chiếu đến SchemaManager thông qua Doctrine EntityManager như sau: $ em-> getConnection() -> getSchemaManager(); – spetz83

Các vấn đề liên quan