2010-07-01 2 views
0

Je suis assez nouveau à Doctrine, mais si je comprends bien, la méthode assignIdentifier() est censée indiquer à Doctrine de mettre à jour la ligne concernée dans la base de données au lieu d'en insérer une nouvelle .Mettre à jour l'objet au lieu d'insérer avec Doctrine en utilisant assignIdentifier()

j'ai un objet que je construis à travers un flux de travail, de sorte que l'identifiant a une id de null jusqu'à ce que j'appelle $object->save(); qui insère, et cela fonctionne.

Si toutefois j'appelle $object->assignIdentifier($newobj->id); puis $object->save(); il ne fait rien - il n'insère pas une nouvelle ligne et ne met pas à jour l'ancien.

Si une certaine condition est vraie, je souhaite extraire un enregistrement différent de la base de données et mettre à jour cette ligne au lieu d'insérer la nouvelle. Est-ce que je comprends quelque chose de mal ici?

code pour illustrer:

if($this->object->payments > 0) {   
    $older_payment = Doctrine_Query::create() 
     ->from('OldPaid p') 
     ->where('p.dealid = ?', $this->object->transid) 
     ->fetchOne() 
    ; 

    $this->object->assignIdentifier($older_payment->id); 
} 

$this->object->save(); 

Répondre

0

Habituellement, si vous récupérez un enregistrement, vous pouvez le mettre à jour avec la méthode save(). Doctrine reconnaît cela (puisque le PK ne change pas) et met à jour l'enregistrement.

Des docs:

Mise à jour des objets est très facile, vous appelez simplement le Doctrine_Record :: save() méthode

Une autre façon peut être replace(), mais je l'utilise habituellement juste save() et effectue l'enregistrement ou la mise à jour si l'enregistrement existe déjà. Dans la mesure où je peux lire de la description de assignIdentifier() jamais utilisé moi-même) il fonctionnera seulement avec la récupération d'un objet par son ID, ainsi mettre à jour quelque chose avec cette méthode ne fonctionnera pas.

2

Comme je l'ai appris, save() ne mettra pas à jour un enregistrement existant avec auto-incrémentation sur ID. J'ai le même problème en utilisant la doctrine 1.2.

une idée que j'ai utiliser celui-ci, le seul workaroung j'ai trouvé:

$query = Doctrine_Query::create()->update('OldPaid'); 
$query->set($yourFieldname, '?', $yourValue); 
$query->addwhere('p.dealid = ?', $this->object->transid); 
$query->execute(); 

Thiw fonctionnera quand un enregistrement est dans le DN avec le primaryKey dealid = $ this-> object-> transid.

salutation m

Questions connexes