php - 无法将 FOR UPDATE 附加到标准推进

标签 php mysql symfony1 propel

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

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

我尝试将上面的 SQL 转换为 propel like

$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 放在了错误的位置,它应该附加在末尾。

谢谢

最佳答案

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

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

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

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

关于php - 无法将 FOR UPDATE 附加到标准推进,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21013443/

相关文章:

symfony1 - 保存覆盖/保存前的 Doctrine 日期

orm - 插入理解同行

php - 以编程方式定义一个包含所有类变量的数组

php - 如何在 php 中将 2 个参数传递给 array_map 函数?

php - 查询数据库后打印出部分唯一的数据

c# - 使用c#插入到mysql表中

php - MySQL Query 中转义不同变量类型的函数

特定排序编号后的 Mysql 更新

session - 为什么 Symfony Session 数据在我的生产服务器上被加密?

php - Ajax调用总是以错误处理程序结尾