Domanda

Il seguente codice restituirà un array di PHP ActiveCord Oggetti:

$book = Book::find('all');

Supponendo che il programma sia a conoscenza dell'ordine dei libri, posso continuare e aggiornare gli attributi dei libri e salvarli nel database come segue:

$book[0]->title = 'my first book';
$book[0]->author = 'Danny DeVito';
$book[4]->title = 'Nice Title';

Per salvare quanto sopra dovrei invocare il ->save() Metodo su ogni oggetto

$book[0]->save();
$book[4]->save();

  1. C'è un modo migliore per farlo? incorporato PHP ActiveCord funzione che salva tutti i membri di una determinata matrice di oggetti o basata su un'associazione?

  2. Supponendo il titolo originale di $book[4] sopra c'era già "bel titolo", sarebbe il ->save() metodo considera $book[4]modificato e continuare con il salvataggio del database?

È stato utile?

Soluzione 2

Dopo molte ricerche ho deciso di pubblicare le mie conclusioni/risposte:

Non esiste una tale funzione di libreria ActiveverId in grado di aggiornare un array di oggetti con valori univoci.

Supponendo che ActiveCord avrebbe sparato a una richiesta di aggiornamento sembrerebbe così:

UPDATE books
   SET title = CASE id
      WHEN 0 THEN 'my first book'
      WHEN 4 THEN 'Nice Title'
   END,
   author = CASE id
      WHEN 0 THEN 'Danny DeVito'
   END
WHERE id IN (0,4)

La stessa domanda di "Come aggiornerei più righe con valori diversi contemporaneamente"Questo andrebbe contro la progettazione di un modello ActiveCord, poiché un oggetto rappresenta una riga e le mappe delle file attraverso le tabelle. Una limitazione evidente per avere un modello così facile con cui lavorare.

Qualsiasi assegnazione agli attributi di un oggetto innesca un flag "sporco" su quell'attributo e qualsiasi chiamata successiva per aggiornare/salvare quell'oggetto attiverà una query anche se il valore dell'attributo assegnato è lo stesso del valore precedente del database/modello. Invocare il metodo Save () quando non sono stati effettuati incarichi non attiva questa query.

Altri suggerimenti

Prova a utilizzare Aggiorna tutto istituito

$update = array();
$update['title'] = 'my first book';
$update['author'] = 'Danny DeVito' ;

$book[0]->update_all(array('set' =>$update));
$book[4]->update_all(array('set' =>array("title"=>"Nice Title"));

Penso che questo dovrebbe essere più pulito

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top