Propel:从Query对象获取Raw SQL?

twi*_*mac 18 php sql orm propel

如何从Propel中的查询对象获取原始SQL语句?我需要这个用于调试目的.

例如:我想要一个函数

$rawSql = new BookQuery::create()->filterById(25)->getRawSql();
Run Code Online (Sandbox Code Playgroud)

这样的事情存在吗?

hal*_*fer 20

是; 你是在Criteria父类的toString方法之后:

$rawSql = (new BookQuery)::create()->filterById(25)->toString();
Run Code Online (Sandbox Code Playgroud)

正如@jakerella所说,用于过滤的特定值将受数据库引擎的约束,而不是Propel,因此您将看到查询的结构,但不会确切地知道要执行的内容.如果要查看,则可以检查数据库查询日志(如果已启用).

  • 很简单... :) (2认同)
  • 请注意,您不会在上面的查询中获得特定的"select"列 - Propel会在查找之前执行此操作.因此,你必须看到类似的东西:`SELECT FROM book WHERE id =:p1; ......:p1 => 25` (2认同)

Pau*_*een 10

履行接受的答案,你可以使用下面的代码之后执行查询.

\Propel::getConnection()->getLastExecutedQuery() // Returns fully qualified SQL
Run Code Online (Sandbox Code Playgroud)

它允许您查看发送到数据库的完整查询(包括选择列和获取的参数).


UPD :( @bbird所述)

除非useDebugtrue:否则此命令不会输出任何内容:

\Propel::getConnection()->useDebug(true);
Run Code Online (Sandbox Code Playgroud)

UPD2 :( 如果您使用的是Symfony框架)

另外值得一提的是PropelORM + Symfony.

如果需要跟踪SQL,则可以使用日志.Propel有自己的monolog通道调用,propelDEBUG在相关通道(propel.DEBUG)上记录日志级别的完全限定查询.

日志/查询记录如下所示:

[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 [] []
Run Code Online (Sandbox Code Playgroud)

  • 注意,除非useDebug为true,否则此命令不会输出任何内容:$ con = Propel :: getConnection(); $ CON组> useDebug(真); $ CON组> getLastExecutedQuery(); (2认同)