2010-08-03 24 views
7

Tôi muốn nhận được truy vấn SQL INSERT chính xác mà Doctrine tạo ra khi phương thức save() của đối tượng được gọi.Học thuyết - cách nhận truy vấn SQL INSERT, trong sự kiện postSave()?

Tốt hơn là, tôi muốn lấy nó trong sự kiện postSave() của mô hình và ghi nó vào một tệp txt.

Ví dụ:

<?php 
$user = new User(); // A Doctrine Model with timestampable behavior enabled 
$user->first_name = 'Manny'; 
$user->last_name = 'Calavera'; 
$user->save(); 
?> 

Tôi muốn nhận/đăng nhập truy vấn SQL sau:

INSERT INTO user (first_name, last_name, created_at, updated_at) VALUES ('Manny', 'Calavera', '2010-08-03 12:00:00', '2010-08-03 12:00:00'); 

Các nền cho cần này, là tôi muốn khối lượng nhập khẩu sau các dữ liệu bằng cách phân tích cú pháp tệp txt.

Trả lời

1

Tôi không nghĩ có cách dễ dàng để làm điều này vì hành vi tiết kiệm() thay đổi tùy thuộc vào một vài điều khác nhau (nếu bạn đang chèn/cập nhật).

Nếu bạn đã tạo ra một đối tượng truy vấn giáo lý, sau đó bạn có thể gọi phương thức getSqlQuery() như thế này:

$q = Doctrine_Query::create() 
->select('u.id') 
->from('User u'); 

echo $q->getSqlQuery(); 

nhưng save() là một phương pháp, không phải là một đối tượng vì vậy đây sẽ không hoạt động . Tôi nghĩ rằng bạn sẽ phải hack trong một số mã để phát hiện xem bạn đang chèn hoặc cập nhật và xây dựng một truy vấn để đăng nhập trên bay và sau đó sử dụng lưu().

Tôi biết đề xuất này không lý tưởng vì nó không ghi lại chính xác những gì lưu() đang làm nhưng với mục đích bạn đã nói nó vẫn hoạt động tốt.

0

Hãy xem ở đây: http://www.phpandstuff.com/articles/codeigniter-doctrine-scratch-day-8-hooks-profiling-dql và đi đến phần đầu Profiling với Học thuyếtTạo một Profiler Hook. Điều này cho phép sử dụng với khung công tác CodeIgniter, nó có thể dễ dàng được chấp nhận vào môi trường của riêng bạn vì mã không phụ thuộc vào khung công tác.

Về cơ bản, bạn muốn thiết lập Trình kết nối và cho phép ghi tất cả các truy vấn vào một tệp. Tôi khuyên bạn nên thêm tất cả truy vấn vào tệp để có cảm giác giống như "nhật ký" tốt hơn. Không bị lẫn lộn bởi nhiều khung nói chuyện bên trong các bài báo. Các ví dụ hoạt động rất tốt (với một chút hiểu biết và sao chép & dán) trong các tình huống khác.

0

bạn có thể sử dụng các hồ sơ từ lớp sfDoctrineDatabase. Sử dụng getQueryExecutionEvents để lấy tất cả các truy vấn.

$databaseManager = sfContext::getInstance()->getDatabaseManager(); 
if ($databaseManager) { 
    foreach ($databaseManager->getNames() as $name) { 
     $database = $databaseManager->getDatabase($name); 
     if ($database instanceof sfDoctrineDatabase && $profiler = $database->getProfiler()) { 
      foreach ($profiler->getQueryExecutionEvents() as $event) { 
       $conn = $event->getInvoker() instanceof Doctrine_Connection ? $event->getInvoker() : $event->getInvoker()->getConnection(); 
       $params = sfDoctrineConnectionProfiler::fixParams($event->getParams()); 
       $query = $event->getQuery() ; 

       foreach ($params as $param) { 
        $param = htmlspecialchars($param, ENT_QUOTES, sfConfig::get('sf_charset')); 
        $query = join(var_export(is_scalar($param) ? $param : (string) $param, true), explode('?', $query, 2)); 
       } 
       // log the $query here, or use the symfony's logger 
       // sfContext::getInstance()->getLogger()->debug(sprintf('Query Run !! %s ', $query)); 
      } 
     } 
    } 
} 

không quên tham gia truy vấn với các thông số

(vì vậy nó sẽ thay thế với các giá trị?): D

+0

đừng quên thêm một số điều kiện trước $ event-> getQuery(), bạn có thể sử dụng "if (! (Stripos ($ event-> getQuery, 'INTO log')) && (strtoupper (substr ($ event) -> getQuery(), 0, 6))! = 'SELECT') && strtoupper (substr ($ event-> getQuery(), 0, 3))! = 'SET') " – HQM

0

Tại sao bạn không thử để xem cách các nhà phát triển symfony làm điều đó ? Kiểm tra Thanh công cụ WebDebug của họ cho Doctrine here. Thanh công cụ WebDebug xuất tất cả truy vấn mà bạn thực hiện trên một trang.

Có móc trên DoctrineEvent và tôi nghĩ bạn có thể sửa đổi mã để thực hiện những gì bạn muốn. Kiểm tra phương thức getDoctrineEventsgetSqlLogs.

Hy vọng điều này sẽ hữu ích. Nếu bạn cần giải thích thêm, xin vui lòng viết nó trong bình luận, tôi sẽ cố gắng hết sức để giải thích.

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