2012-06-27 17 views
11

Để gỡ lỗi mã của tôi, tôi muốn xem truy vấn sql rõ ràng được thực hiện.Làm cách nào để xem các tham số trong truy vấn?

tôi tạo ra các truy vấn với createQueryBuilder, và điều rõ ràng nhất mà tôi đạt được là có truy vấn liệu sử dụng:

$qb->getQuery()->getSQL(); 

Vấn đề là thay vì các thông số tôi thấy chủ sở hữu (?). Tôi tìm thấy một số giải pháp trên web nhưng chúng dành cho 1,3 và 1,4, không có gì cho Symfony-2.

Ý tưởng? Cảm ơn!

+3

Thực ra, câu hỏi của bạn trùng lặp với http://stackoverflow.com/q/2095394/795876 này. Doctrine đang sử dụng câu lệnh chuẩn bị, do đó không bao giờ có một truy vấn SQL "thực" ở phía PHP và Doctrine không thể hiển thị nó. Tuy nhiên, bạn có thể đọc giải pháp này http://stackoverflow.com/a/10577703/795876 cho mục đích gỡ lỗi của bạn. – fsenart

+2

Ngoài ra, học thuyết 2 có lớp sqlLogger: http://doctrine-orm.readthedocs.org/en/2.0.x/reference/configuration.html#sql-logger-optional – manix

+0

** fsehat ** - trông giống như giải pháp này là dành cho Symfony 1.4, tôi không thể tìm thấy trong toàn bộ dự án không phải là hàm 'getSqlQuery' hay' getFlattenedParams' (là hàm mà tôi đang thiếu). ** manix ** - bạn có tham khảo thêm tài liệu về cách sử dụng trình ghi nhật ký trong Symfony 2.x không? Nó trông giống như một giải pháp tốt nhưng tôi không tìm thấy bất kỳ tài liệu tốt. ** Cảm ơn cả hai! ** – guyaloni

Trả lời

27

Bạn có thể truy cập vào các thông số được sử dụng bởi các placeholders sử dụng $query->getParameters(), vì vậy bạn có thể gỡ lỗi truy vấn của bạn sử dụng:

$query = $qb->getQuery(); 
print_r(array(
    'sql'  => $query->getSQL(), 
    'parameters' => $query->getParameters(), 
)); 
+2

Về cơ bản, đó là một ý tưởng hay.Vấn đề là các túi thông số có thể chứa các đối tượng, và sau đó cố gắng in nó cho chuỗi lớn. Những gì tôi muốn làm là chuyển đổi các túi thông số được trả về bởi '$ query-> getParameters()' thành một mảng các chuỗi có thể thay thế các phần giữ chỗ '?'. – guyaloni

+2

Tôi nghĩ rằng mảng này đã là một mảng các giá trị vô hướng, nếu bạn nhìn vào phương thức setParameter https://github.com/doctrine/doctrine2/blob/2.2/lib/Doctrine/ORM/AbstractQuery.php#L202, nó call processParameterValue biến đổi mảng và đối tượng thành các giá trị vô hướng https://github.com/doctrine/doctrine2/blob/2.2/lib/Doctrine/ORM/AbstractQuery.php#L227 – AdrienBrault

+0

Hài hước, tôi nhận được (theo như tôi hiểu .. .) phiên bản cuối cùng của tất cả các nhà cung cấp, và 'AbstractQuery.php' và' Query.php' của tôi có một chút khác biệt. Có lẽ những gì tôi có là Doctrine 2.1 trong khi mã này là 2.2. Dù sao, tôi đã thêm một phương thức vào tệp 'Query.php' trả về các tham số sql + thô, dựa trên các câu trả lời của bạn. Cảm ơn! – guyaloni

2

Bạn có thể dễ dàng truy cập vào các thông số SQL bằng cách sử dụng phương pháp sau đây.

$result = $qb->getQuery()->getSQL(); 

    $param_values = ''; 
    $col_names = ''; 

    foreach ($result->getParameters() as $index => $param){    
      $param_values .= $param->getValue().','; 
      $col_names .= $param->getName().','; 
    } 

    //echo rtrim($param_values,','); 
    //echo rtrim($col_names,',');  

Vì vậy, nếu bạn in ra các $param_values$col_names, bạn có thể nhận được các giá trị tham số đi qua sql và tên cột tương ứng.

Lưu ý: Nếu $param trả về một mảng, bạn cần phải lặp lại, vì các tham số bên trong IN (:?) thường đến là một mảng lồng nhau.

Thời gian chờ đợi nếu bạn tìm thấy cách tiếp cận khác, vui lòng chia sẻ với chúng tôi :)

Cảm ơn bạn!

0

Tôi phải xây dựng một liên minh đầy đủ (không thể với DQL hoặc QueryBuilder) với 5 truy vấn đã được tạo bằng QueryBuilder. Vì vậy, tôi sử dụng lại các truy vấn này nhưng tôi đã gặp sự cố khi sử dụng hàm getParameters() vì nó cung cấp thông số theo cùng thứ tự bạn đã cung cấp cho nó. Một trong những lợi thế khi bạn sử dụng trình tạo truy vấn là bạn có thể tạo một truy vấn theo thứ tự yhou muốn nhưng khi bạn truy xuất các tham số, bạn có thể truy xuất nó trong lộn xộn. để tránh điều này tôi đã xây dựng các chức năng sau:

$getSqlWithParams = \Closure::bind(function(){ 
     return [$this->getSql(), $this->processParameterMappings($this->_parserResult->getParameterMappings())]; 
    }, null, Query::class); 

bây giờ khi bạn muốn lấy sql và các thông số được sắp xếp bạn làm:

$getSqlWithParams()->call($query) 

Đừng quên sử dụng \ tuyên bố Học thuyết \ ORM \ Query . Và voilà!

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