使用symfony / propel进行增量更新

时间:2009-12-05 08:54:51

标签: php database symfony1 propel

我想使用Propel ORM在symfony中执行类似这样的查询:

UPDATE ADS SET HITS=HITS+1 WHERE ID=10;    

我知道Propel API可以让我为给定记录的列设置以前固定的值,但我绝对不希望在发出更新查询之前先检索列值,因为存在并发访问。

拜托,我怎么能实现这个目标?

感谢。

2 个答案:

答案 0 :(得分:1)

这适用于Symfony 1.3 / 1.4:

在AdsPeer中

public static function incrementHits($id)
{
  $con = Propel::getConnection(AdsPeer::DATABASE_NAME);
  $query = 'UPDATE hits SET hits + 1 WHERE id = '.$id;
  sfContext::getInstance()->getLogger()->crit($query);
  $stmt = $con->prepare($query);
  $rs = $stmt->execute();
}

使用:

AdsPeer::incrementHits($id);

HTH

麦克

答案 1 :(得分:0)

如果你愿意,你可以在推进中做Select using SQL

以下是一个例子:

class BookPeer extends BaseBookPeer {
  .
  .
  .
  /**
   * Get just the Books that have not been reviewed.
   * @return array Book[]
   */
  function getUnreviewedBooks() {
    $con = Propel::getConnection(DATABASE_NAME);

    // if not using a driver that supports sub-selects
    // you must do a cross join (left join w/ NULL)
    $sql = "SELECT books.* FROM books WHERE ".
           "NOT EXISTS (SELECT id FROM review WHERE book_id = book.id)";

    $stmt = $con->createStatement();
    $rs = $stmt->executeQuery($sql, ResultSet::FETCHMODE_NUM);

    return parent::populateObjects($rs);    
  }

您也可以使用update尝试此操作。