【问题标题】:Propel: Get Raw SQL from Query object?推进:从查询对象获取原始 SQL?
【发布时间】:2013-04-26 12:46:55
【问题描述】:

如何从 Propel 的查询对象中获取原始 SQL 语句?我需要这个来进行调试。

例如:我想要一个函数

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

这样的东西存在吗?

【问题讨论】:

    标签: php sql orm propel


    【解决方案1】:

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

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

    正如@jakerella 所说,您用于过滤的特定值将由数据库引擎而不是 Propel 绑定,因此您将看到查询的结构,但不知道将执行的确切内容。如果您想查看,那么您可以检查您的数据库查询日志(如果它们已启用)。

    【讨论】:

    • 请注意,您不会在上面的查询中获得特定的 select 列 - Propel 会在查找之前执行此操作。因此,您必须看到类似:SELECT FROM book WHERE id=:p1; ... :p1=>25
    • @jakerella:你能在答案中扩展它吗?我不确定这是否说明了如何执行您的建议。
    • @halfer 你的答案是正确的,只是Propel在最后一刻绑定了select列,所以你可能看不到SQL中的选定列(注意在我的例子中没有什么在SELECTFROM 之间)。 Propel 不使用* 选择所有列,它在每个查询中手动添加所有必要的列。
    【解决方案2】:

    完成接受的答案,您可以使用下一个代码之后查询执行。

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

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


    UPD:(@bbird 所述)

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

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

    UPD2:(如果您使用 Symfony 框架

    还有一点值得一提的是PropelORM+Symfony

    如果您需要跟踪 SQL,可以使用日志。 Propel 有自己的 monolog 通道,称为 propel,并且完全限定的查询会在相关通道 (propel.DEBUG) 上使用 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 [] []
    

    【讨论】:

    • 非常有希望的建议!我期待着尝试一下。
    • 请注意,除非 useDebug 为真,否则此命令不会输出任何内容: $con = Propel::getConnection(); $con->useDebug(true); $con->getLastExecutedQuery();
    猜你喜欢
    • 1970-01-01
    • 2014-02-15
    • 2016-09-14
    • 1970-01-01
    • 2013-10-31
    • 2021-10-12
    • 2012-09-21
    • 2010-12-03
    • 2015-05-05
    相关资源
    最近更新 更多