我想使用Propel ORM在symfony中执行类似这样的查询:
UPDATE ADS SET HITS=HITS+1 WHERE ID=10;
我知道Propel API可以让我为给定记录的列设置以前固定的值,但我绝对不希望在发出更新查询之前先检索列值,因为存在并发访问。
拜托,我怎么能实现这个目标?
感谢。
答案 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
尝试此操作。