2010-02-08 3 views
1

Je commence juste à me familiariser avec cakephp (merci au développeur avant moi), et j'ai eu un truc marrant. J'ai finalement découvert ce qui n'allait pas, mais je ne sais toujours pas pourquoi. Dans le code très pseudo:cakephp appmodel sauvegarder la question

fonction de contrôleur appelle barre() deux fois dans la même portée:

$value = 'A'; 
$this->foo->bar($value); 
// do other stuff 
$value = 'B'; 
$this->foo->bar($value); 

bar() appelle simplement le modèle des années CakePHP save() pour écrire $ la valeur à la table foobar $:

$AppModel->save(array(
    'AppModel'=> array('value'=>$value) 
)); 

Je m'attendais à ce que save() crée deux lignes dans foobar $, mais ce n'était pas le cas. Il a d'abord créé une ligne avec la valeur A, puis mis à jour cette ligne à la valeur B. Lorsque le deuxième appel a couru, il a reconnu l'ID de DB généré par l'appel précédent, a décidé qu'il s'agissait de la même entrée. C'est logique, mais ce sont toujours des appels distincts, n'est-ce pas? Quelle chose évidente manque-t-je ici? Merci beaucoup.

Répondre

5

Après avoir enregistré quelque chose dans la base de données, Cake définit le $Model->id sur le dernier ID d'insertion. Lors de la sauvegarde, si un champ id est enregistré dans le tableau de données, il est supposé enregistrer, ou s'il existe un ID défini sur $Model->id, Cake mettra à jour cette entrée à la place. Ces deux mise à jour de l'entrée 42:

$Model->save(array('id' => 42, 'value' => 'foo')); 

$Model->id = 42; 
$Model->save(array('value' => 'foo')); 

Pour vous assurer que vous créez une nouvelle entrée, appelez Model::create(), comme décrit here.

2

Généralement, je mets toujours un appel de création de modèle avant une sauvegarde. Si le tableau de votre épargne a la clé primaire déjà mettra à jour la ligne, sinon il fait un insert:

Insérer:

$Model->create(); 
$Model->save(array('value'=>'foo')); 

Mise à jour

$Model->create(); 
$Model->save(array('id'=>1,'value'=>bar')); 
Questions connexes