2015-09-23 16 views
9

Sono nuovo di propulsione, e sto cercando un modo per incrementare un valore nel mio database MySQL, senza dover fare un ciclo completo di lettura-aggiornamento-scrittura. Come ad esempio questo:Valore di incremento nel database utilizzando Propel

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

Certo che posso fare:

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

Ma ciò si tradurrebbe in 2 query (SELECT e l'aggiornamento).

C'è un modo pulito per farlo in Propel?

+0

È possibile eseguire SQL direttamente in propel; in caso contrario, è possibile utilizzare una combinazione di create() -> filterBy() -> update() per ottenere ciò che si desidera. – versalle88

+0

So che posso fare l'SQL dritto in Propel, ma voglio solo capire come risolvere questo problema con Propel. Inoltre, se utilizzo update(), quale aspetto dovrebbe avere la sintassi per incrementare un valore? –

risposta

1

C'è un modo pulito per farlo in Propel?

No, ma c'è un modo. ;) È possibile utilizzare il parametro Criteria::CUSTOM_EQUAL con 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); 

Questo è come il comportamento ordinabile implements rango spostamento.

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

doUpdate() è una funzione privata che non può essere utilizzata all'esterno.