如何获得大于或等于symfony中当前记录的下一条记录?

时间:2013-03-01 05:05:58

标签: php sql symfony-1.4 propel

这是我的代码:

$c = new Criteria();
$c->addAscendingOrderByColumn(ItemPeer::ITEM_DATE);
$c->add(ItemPeer::ITEM_DATE, $item->getItemDate(), Criteria::GREATER_THAN);
$this->next = ItemPeer::doSelectOne($c);

除非多个日期相同,否则此工作正常,例如:3/1/2013和3/1/2013

当发生这种情况时,它不会选择下一个。例如(按日期排序):

Apple     2/27/2013
Banana    2/28/2013
Kiwi      3/1/2013
Dolphin   3/1/2013
ICBM      3/1/2013

如果当前项目为Banana,则下一个项目将被正确选为Kiwi。但是,如果当前项目为Kiwi,则无法找到下一个项目。我希望总是选择下一个日期,即使下一个日期是相同的。我怎么能这样做?

1 个答案:

答案 0 :(得分:1)

使用Criteria::GREATER_EQUAL代替Criteria::GREATER_THAN

编辑:啊,我现在看到你的问题了,你应该add a second ordering criteria。也许使用主键作为第二个标准,因此您获得一致的排序,然后使用第二个排序来确定下一个项目。基本上,您需要在symfony中等效select ... from ... where (item_date > mydate) or (item_date = mydate and id > myid) order by date, id asc

EDIT2:

$c = new Criteria();
// [item.item_date > $item->getItemDate()]
$crit0 = $c->getNewCriterion(ItemPeer::ITEM_DATE, $item->getItemDate(), Criteria::GREATER_THAN);
// [item.item_date = $item->getItemDate()]
$crit1 = $c->getNewCriterion(ItemPeer::ITEM_DATE, $item->getItemDate());
// [item.id > $item->id]
$crit2 = $c->getNewCriterion(ItemPeer::ID, $item->getId(), Criteria::GREATER_THAN);

// [item.item_date = $item->getItemDate()] *AND* [item.id > $item->getId()]
$crit1->addAnd($crit2);

// [item.item_date > $item->getItemDate()] *OR* [[item.item_date = $item->getItemDate()] AND [item.id > $item->getId()]]
$crit0->addOr($crit1);

$c->add($crit0);
$c->addAscendingOrderByColumn(ItemPeer::ITEM_DATE);
$c->addAscendingOrderByColumn(ItemPeer::ID);

$this->next = ItemPeer::doSelectOne($c);