【问题标题】:Unable to Append FOR UPDATE to the criteria propel无法将 FOR UPDATE 附加到标准推进
【发布时间】:2014-01-09 06:50:37
【问题描述】:

我需要将 mysql 查询转换为推进标准,

$subSelect = " SELECT * FROM " . NotificationqueuePeer::TABLE_NAME . 
                 " where " . NotificationqueuePeer::ITNOTIFICATIONQUEUESTATUS . " = " . Notificationqueue :: STATUS_UNSENT . 
                 " OR " . NotificationqueuePeer::ITNOTIFICATIONQUEUESTATUS . " = " . Notificationqueue :: STATUS_TRIED . 
                 " LIMIT 5 FOR UPDATE ";

我尝试将上面的 SQL 转换为类似的推进方式

$crit= new Criteria();

        $crit->add(NotificationqueuePeer::ITNOTIFICATIONQUEUESTATUS, Notificationqueue :: STATUS_UNSENT);
        $crit->addOr(NotificationqueuePeer::ITNOTIFICATIONQUEUESTATUS, Notificationqueue :: STATUS_TRIED);
        $crit->setLimit(5);
        $crit->add(' FOR UPDATE ', Criteria::CUSTOM);

        $notifications = NotificationqueuePeer::doSelectRS($crit);
        echo '<pre>';
        print_r($notifications);

当我打印时,查询是:

SELECT column1, column2,...,  FOR UPDATE  WHERE  AND (NOTIFICATIONQUEUE.ITNOTIFICATIONQUEUESTATUS=1
OR NOTIFICATIONQUEUE.ITNOTIFICATIONQUEUESTATUS=3) LIMIT 5

如您所见,FOR UPDATE 位置错误,应将其附加在末尾。

谢谢

【问题讨论】:

    标签: php mysql symfony1 propel


    【解决方案1】:

    不确定这是哪个版本的 Propel/Symfony1,但我可以回答 Symfony 1.0。

    第一个参数Criteria::add() 始终假定为一列,这就是为什么FOR UPDATE 似乎出现在您的选择列列表中。我认为没有任何方法可以使用 Criteria::add()FOR UPDATE 附加到查询的末尾。 Propel 将以非常特定的顺序从每个提供的组件(连接、位置、订单等)构建查询,该顺序总是以 LIMIT 和 OFFSET 子句(如果有)结束。

    使用纯 SQL 或使用 Criteria 构建查询的其余部分会简单得多,使用 NotificationqueuePeer::createSelectSql($crit) 获取结果 SQL(如果这确实是 Symfony 1.0 / Propel 1.2),然后附加您的附加部分到结果。无论哪种方式,您仍然需要自己执行它并填充结果集。

    如果您想确切了解正在发生的事情以及为什么值得深入研究 Propel 代码(它相对简单)并了解 doSelectRS 的实际工作原理。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-12-16
      • 1970-01-01
      • 2011-12-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-23
      • 2019-07-14
      相关资源
      最近更新 更多