инкрементное обновление с помощью Symfony / Propel - PullRequest
2 голосов
/ 05 декабря 2009

Я бы хотел выполнить такой запрос в Symfony, используя Propel ORM:

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

Я знаю, что Propel API может позволить мне установить ранее фиксированное значение для столбца данной записи, но я определенно не хочу сначала извлекать значение столбца перед отправкой запроса на обновление, поскольку существует одновременный доступ.

Пожалуйста, как мне этого добиться?

Спасибо.

Ответы [ 2 ]

1 голос
/ 29 марта 2010

Это работает в 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);

НТН

Mike

0 голосов
/ 05 декабря 2009

Если хотите, вы можете сделать Выбрать, используя SQL в Propel.

Вот пример:

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.

...