2013-05-02 12 views
17

Làm cách nào để nhận được câu lệnh SQL thô từ một đối tượng truy vấn trong Propel? Tôi cần điều này cho mục đích gỡ lỗi.Propel: Nhận SQL thô từ đối tượng truy vấn?

Ví dụ: Tôi muốn có một chức năng như trong

$rawSql = new BookQuery::create()->filterById(25)->getRawSql(); 

Có một cái gì đó như thế này tồn tại?

Trả lời

19

Có; bạn sau khi phương pháp toString từ lớp Criteria mẹ:

$rawSql = (new BookQuery)::create()->filterById(25)->toString(); 

Như @jakerella nói, các giá trị cụ thể mà bạn sử dụng để lọc sẽ bị ràng buộc bởi các công cụ cơ sở dữ liệu, chứ không phải là Propel, và do đó bạn sẽ thấy cấu trúc của truy vấn nhưng không chính xác những gì sẽ được thực hiện. Nếu bạn muốn thấy điều đó, thì bạn có thể kiểm tra nhật ký truy vấn cơ sở dữ liệu của mình, nếu chúng được bật.

+2

Vì vậy, đơn giản ... :) – twigmac

+2

Lưu ý rằng bạn sẽ không nhận cột select' cụ 'trong các truy vấn trên - Propel nào đó ngay trước khi tìm . Vì vậy, bạn phải thấy một cái gì đó như: 'SELECT FROM book WHERE id =: p1; ...: p1 => 25' – jakerella

+0

@jakerella: bạn có thể mở rộng trên đó trong câu trả lời không? Tôi không chắc chắn làm cho nó rõ ràng làm thế nào để làm những gì bạn đang đề xuất. – halfer

8

Hoàn thành câu trả lời được chấp nhận, bạn có thể sử dụng mã tiếp theo sau đó thực hiện truy vấn.

\Propel::getConnection()->getLastExecutedQuery() // Returns fully qualified SQL 

Nó cho phép bạn xem các đầy đủ truy vấn (bao gồm cột chọn và các thông số lấy) mà đã được gửi đến cơ sở dữ liệu.


UPD: (như đã đề cập bởi @bbird)

Lệnh này sẽ không ra bất cứ điều gì trừ khi useDebugtrue:

\Propel::getConnection()->useDebug(true); 

UPD2: (nếu bạn đang sử dụng Symfony framework)

hơn Một điều đáng nói là PropelORM + Symfony.

Nếu bạn cần theo dõi SQL, có thể sử dụng nhật ký. Propel có kênh monolog riêng có tên là propel và các truy vấn đủ điều kiện được ghi lại với DEBUG cấp nhật ký trên kênh có liên quan (propel.DEBUG).

Log ghi/truy vấn như sau:

[2016-10-04 17:00:46] propel.DEBUG: time: 0.000 sec | mem: 24.8 MB | connection: default | SELECT `id`, `username`, `email`, `last_login` FROM `users` WHERE `id` = 123 [] [] 
+1

Đề xuất rất hứa hẹn! Tôi đang mong chờ thử điều này. – twigmac

+2

Lưu ý lệnh này sẽ không xuất ra bất cứ điều gì trừ khi useDebug là đúng: $ con = Propel :: getConnection(); $ con-> useDebug (true); $ con-> getLastExecutedQuery(); – bbird