2012-06-10 23 views
5

Tôi đang sử dụng Doctrine với Symfony trong một vài dự án ứng dụng web.Xác định trường nào khiến cho Doctrine truy vấn lại cơ sở dữ liệu

Tôi đã tối ưu hóa nhiều truy vấn trong các dự án này để chỉ chọn các trường cần thiết từ cơ sở dữ liệu. Nhưng theo thời gian các tính năng mới đã được thêm vào và - trong một vài trường hợp - các trường bổ sung được sử dụng trong mã, khiến trình tải chậm Doctrine truy vấn lại cơ sở dữ liệu và tăng số truy vấn trên một số trang từ 3 đến 100+

Vì vậy, tôi cần cập nhật truy vấn ban đầu để bao gồm tất cả các trường bắt buộc. Tuy nhiên, dường như không có cách nào dễ dàng để Doctrine đăng nhập trường nào khiến truy vấn bổ sung được phát hành - do đó, nó trở thành một công việc siêng năng để sàng lọc mã tìm kiếm việc sử dụng các trường không có trong truy vấn ban đầu.

Có cách nào để có nhật ký Doctrine khi trình khởi động truy cập một trường chưa được ngậm nước không?

Trả lời

1

Tôi chưa gặp sự cố này nhưng chỉ xem xét lớp Doctrine_Record. Bạn đã thử thêm một số đầu ra gỡ lỗi vào phương thức _get() chưa? Tôi nghĩ rằng phần này là nơi bạn nên tìm kiếm một giải pháp:

if (array_key_exists($fieldName, $this->_data)) { 
     // check if the value is the Doctrine_Null object located in self::$_null) 
     if ($this->_data[$fieldName] === self::$_null && $load) { 
      $this->load(); 
     } 
+0

Đây là con đường tôi đã kết thúc việc. –

1

Chỉ cần bật ghi nhật ký SQL và bạn có thể suy ra câu lệnh có lỗi từ tên bí danh. Để biết cách thực hiện trong Doctrine 1.2, hãy xem mục post.

Về cơ bản: tạo ra một lớp mà kéo dài Doctrine_EventListener:

class QueryDebuggerListener extends Doctrine_EventListener 
{ 
    protected $queries; 

    public function preStmtExecute(Doctrine_Event $event) 
    { 
     $query = $event->getQuery(); 
     $params = $event->getParams(); 

     //the below makes some naive assumptions about the queries being logged 
     while (sizeof($params) > 0) { 
      $param = array_shift($params); 

      if (!is_numeric($param)) { 
       $param = sprintf("'%s'", $param); 
      } 

      $query = substr_replace($query, $param, strpos($query, '?'), 1); 
     } 

     $this->queries[] = $query; 
    } 

    public function getQueries() 
    { 
     return $this->queries; 
    } 
} 

Và thêm người nghe sự kiện:

$c = Doctrine_Manager::connection($conn); 
$queryDbg = new QueryDebuggerListener(); 
$c->addListener($queryDbg); 
+0

Điều này dành cho Doctrine2. OP sử dụng Doctrine 1. – j0k

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