Posso aggiungere una condizione alla dichiarazione di aggiornamento di CakePHP?

Dal momento che non sembra esserci alcun supporto per il block ottimistico in CakePHP , mi sto dando da fare per build un comportmento che lo implementa. Dopo una piccola ricerca sui comportmenti, penso che potrei eseguire una query nell'evento beforeSave per verificare che il field della versione non sia cambiato.

Tuttavia, preferirei implementare il controllo cambiando la clausola WHERE dell'istruzione di aggiornamento da

WHERE id = ? 

a

 WHERE id = ? and version = ? 

In questo modo non devo preoccuparmi di altre richieste che cambiano il record del database tra il momento in cui leggo la versione e il momento in cui eseguo l'aggiornamento. Significa anche che posso fare una chiamata al database invece di due.

Vedo che il metodo DboSource.update() support le condizioni, ma Model.save() non passa mai alcuna condizione.

Sembra che abbia un paio di opzioni:

  1. Effettua il check in beforeSave() e beforeSave() con il fatto che non sia a prova di proiettile.
  2. Hack la mia copia locale di CakePHP per verificare la presenza di una chiave di conditions nell'arrays delle options di Model.save() e passarla al metodo DboSource.update() .

In questo momento, mi sto appoggiando alla seconda opzione, ma ciò significa che non posso condividere il mio comportmento con altri utenti a less che non applichino il mio trucco al loro framework.

Ho perso un'opzione più semplice?

Quando si utilizza save() per aggiornare un record, Cake si aspetta che sia presente un id e aggiornerà solo il record con questo id .

Quello che stai cercando è updateAll() :

updateAll(arrays $fields, arrays $conditions)

Aggiorna molti record in una singola chiamata. I record da aggiornare sono identificati dall'arrays $ conditions e i campi da aggiornare, insieme ai loro valori, sono identificati dall'arrays $ fields.

Ad esempio, per approvare tutti i fornai che sono membri da oltre un anno, la chiamata di aggiornamento potrebbe essere simile a:

 $this_year = date('Ymd h:i:s', strtotime('-1 year')); $this->Baker->updateAll( arrays('Baker.approved' => true), arrays('Baker.created <=' => "$this_year") ); 

Sono andato con l'hacking della mia copia locale di CakePHP. Non ho guardato di recente per vedere se le ultime versioni di CakePHP offrono nuove opzioni.