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

时间:2014-01-09 06:50:37

标签: 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转换为像

一样推进
$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 位置错误,应该在最后附加。

由于

1 个答案:

答案 0 :(得分:0)

不确定这是哪个版本的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实际上是如何工作的。