Question

Le code suivant va retourner un tableau de PHP Activerecord Objets:

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

En supposant que le programme est au courant de la commande des livres, je peux continuer et de mettre à jour les attributs des livres et de les enregistrer dans la base de données comme suit:

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

afin d'économiser la dessus je dois appeler la ->save() méthode sur chaque objet

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

  1. Est-il une meilleure façon de le faire?intégré PHP ActiveRecord la fonction enregistrement de tous les membres d'un même groupe d'objets, ou sur la base d'un association?

  2. En supposant que le titre original de $book[4] ci-dessus a été déjà " Nice Titre", l' ->save() méthode envisager $book[4]changé et continuer avec la base de données enregistrer?

Était-ce utile?

La solution 2

Après beaucoup de recherches, j'ai décidé de poster mes conclusions/réponses:

Il n'y a pas une telle ActiveRecord fonction de bibliothèque qui peut mettre à jour une tableau d'objets avec des valeurs uniques.

En supposant que Activerecord de tirer une demande de mise à jour, il devrait ressembler à ceci:

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 même question que "comment puis-je mettre à jour plusieurs lignes avec des valeurs différentes à la fois".Ce serait aller à l'encontre de la conception d'un Activerecord modèle, comme un Objet représente une ligne, et les cartes des lignes à travers les tables.Une limite évidente pour avoir un tel modèle facile à travailler avec.

Toute cession à un attributs de l'Objet déclenche une "sale" drapeau sur cet attribut, et tout appel ultérieur à la mise à jour/enregistrer objet sera le déclencheur d'une requête, même si la valeur de l'attribut est affecté la même que la base de données/modèle valeur précédente.L'invocation de la méthode save() lorsque aucune des affectations ont été faites ne déclenche pas cette de la requête.

Autres conseils

Essayez d'utiliser la mise à jour tous les insted

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

Je pense que cela devrait être plus propre

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top