我需要将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 位置错误,应该在最后附加。
由于
答案 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
实际上是如何工作的。