gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 03:36:26 24 4
gpt4 key购买 nike

我需要将 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com