2015-09-23 8 views
9

私は新しいpropelですが、完全な読み取り更新書き込みサイクルを行うことなく、MySQLデータベースの値をインクリメントする方法を探しています。私が行うことができます。もちろん、Propelを使用したデータベースのインクリメント値

UPDATE books SET popularity = popularity + 1 WHERE id = 123 

$book = new BookQuery::create()->findPk(123); 
$book->setPopularity($book->getPopularity() + 1); 
$book->save(); 

しかし、それは2つのクエリ(SELECTとUPDATE)につながるこのような。

Propelでこれを行うためのきれいな方法はありますか?

+0

propelで直接SQLを実行できます。それ以外の場合は、create() - > filterBy() - > update()の組み合わせを使用して必要な処理を実行できます。 – versalle88

+0

私はPropelでSQLをまっすぐにすることができますが、Propelでこれを解決する方法を理解したいと思っています。また、私がupdate()を使用する場合、構文を変更して値を増やすのはどうでしょうか? –

答えて

1

これはPropelでうまくいく方法がありますか?

いいえ、しかし方法があります。 ;)あなたはCriteria->add()Criteria::CUSTOM_EQUALパラメータを使用することができます。

$con = Propel::getConnection(BooksPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); 
$whereCriteria = BooksQuery::create()->filterById(123); 
$valuesCriteria = new Criteria(BooksPeer::DATABASE_NAME); 
$valuesCriteria->add(BooksPeer::POPULARITY, BooksPeer::POPULARITY . " + 1", Criteria::CUSTOM_EQUAL); 
BasePeer::doUpdate($whereCriteria, $valuesCriteria, $con); 

これはどのようにソート可能な振る舞いimplementsランクシフトです。

0
BasePeer::doUpdate($whereCriteria, $valuesCriteria, $con); 

doUpdate()は、外部では使用できないプライベート関数です。

関連する問題