2015-09-23 1 views
9

Je suis nouveau à propulser, et je cherche un moyen d'incrémenter une valeur dans ma base de données MySQL, sans avoir à faire un cycle complet de lecture-mise à jour-écriture. Tels que ceci:Valeur d'incrément dans la base de données en utilisant Propel

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

Bien sûr que je peux faire:

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

Mais cela se traduirait par 2 requêtes (le SELECT et la mise à jour).

Existe-t-il une façon simple de faire cela dans Propel?

+0

Vous pouvez faire SQL directement dans propel; Sinon, vous pouvez utiliser une combinaison de create() -> filterBy() -> update() pour accomplir ce que vous voulez. – versalle88

+0

Je sais que je peux faire du SQL directement dans Propel, mais je veux juste comprendre comment résoudre ce problème avec Propel. Aussi, si j'utilise update(), à quoi ressemblerait la syntaxe pour incrémenter une valeur? –

Répondre

1

Existe-t-il une façon simple de faire cela dans Propel?

Non, mais il y a un moyen. ;) Vous pouvez utiliser le paramètre Criteria::CUSTOM_EQUAL avec Criteria->add():

$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); 

Voici comment le comportement triables implements changement de rang. DoUpdate() est une fonction privée qui ne peut pas être utilisée à l'extérieur.

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