Comparing versions, seems that Doctrine 1.1 manage this logic calling unlinkInDb if parameter $now is set to true. This method doesn't exists on Doctrine 1.0 but if you check the src you'll find that it just make a delete query on database. You can replace the unlink and link calls with this query (only if record already exists) or maybe you found some way to override the unlink and link functions. The Symfony generator doesn't provide a base class for models (like with forms), so you will need to modify every model class :( or modify the generator templates.
Regards El Monday 09 March 2009 18:07:05 Nicolas Garnault escribió: > I meant the "manual fix" you mentionned (adding the third parameter to > link() and unlink() methods) > > Taiku > > 2009/3/9 Hugo Sarti <[email protected]> > > > Mmm, I'm working with Doctrine 1.1 and still have this problem... where > > did you found the fix/patch? > > > > El Monday 09 March 2009 17:47:33 Nicolas Garnault escribió: > > > Thanks a lot Hugo, > > > > > > However, it seems to be a valid fix for Doctrine 1.1, and since > > > > Doctrine1.1 > > > > > is not shipped with any version of symfony, would you have any idea of > > > > what > > > > > could be done to fix this with Doctrine1.0 ? > > > > > > Thanks by advance for you answer, > > > > > > Cheers, > > > > > > Taku > > > > > > 2009/3/9 Hugo Sarti <[email protected]> > > > > > > > I think that it's a bug, but not sure if from Symfony or Doctrine > > > > (since > > > > > > the corresponding functions are defined at Doctrine lib)... if you > > > > override the saveFIELDNAMEList() function and modify the following > > > > function calls: $this->object->unlink('XXX', array()); > > > > $this->object->link('XXX', $values); > > > > > > > > > > > > by: > > > > > > > > > > > > $this->object->unlink('XXX', array(), true); > > > > $this->object->link('XXX', $values, true); > > > > > > > > > > > > then it works. The last param (true) force the operation to execute > > > > now on database but I'm pretty sure that it won't follow the > > > > transactional order. > > > > > > > > > > > > Let's wait some response from devs to check where do you need to make > > > > a ticket > > > > > > > > > > > > Regards > > > > > > > > El Sunday 08 March 2009 23:13:13 Nicolas Garnault escribió: > > > > > Hello all, > > > > > > > > > > I recently noticed a quite annoying bug with sfFormDoctrine ... > > > > > I've got a quite simple schema, in which I've got three classes : > > > > > "Task", "Category", and "TaskCategory" ; "Task" and "Category" > > > > relation > > > > > > > type is n:m. > > > > > > > > > > The problem is that, when I generate a crud to administrate Task > > > > > objects, TaskForm doesn't save the TaskCategory relation properly : > > > > the > > > > > > > "task_id" and "category_id" values of the TaskCategory object are > > > > > "switched". > > > > > > > > > > I mean that saving a Task object with id = 1 after having associed > > > > > it > > > > > > > > with > > > > > > > > > a Category whose id = 5 will make Doctrine try to save a > > > > > TaskCategory object that will contain [task_id : 5, category_id : > > > > > 1]. > > > > > > > > > > I join to this message the concerned part of the stacktrace I get > > > > when > > > > > > > I try to submit my form (exception is thrown here because I try to > > > > save > > > > > > > a task with id = 1 with a category whose id = 5. As the values are > > > > > switch > > > > > > > > and > > > > > > > > > as it doesn't exist any task with id = 5, doctrine throws me an > > > > > integrity violation on the foreign key constraint). > > > > > > > > > > > > > > > Did anyone already notice this ? > > > > > > > > > > > > > > > Cheers, > > > > > > > > > > Taku (sorry for my english) > > > > > > > > > > > > > > > > > > > > > > > > > StackTrace : > > > > > > > > > > > > > > > - at *Doctrine_Connection_Statement->execute*(*array*('1', '5')) > > > > > in * > > > > SF_SYMFONY_LIB_DIR/plugins/sfDoctrinePlugin/lib/vendor/doctrine/Doctrine/ > > > > > >Co > > > > > > > > >nnection.php * line 1041 ... > > > > > <http://kontei/frontend_dev.php/task/update/id/1#> 1. try { > > > > > 2. if ( ! empty($params)) { > > > > > 3. $stmt = $this->prepare($query); > > > > > 4. $stmt->execute($params); > > > > > 5. > > > > > 6. return $stmt->rowCount(); > > > > > 7. } else { > > > > > - at *Doctrine_Connection->exec*('INSERT INTO task_category > > > > > (category_id, task_id) VALUES (?, ?)', *array*('1', '5')) > > > > > in * > > > > SF_SYMFONY_LIB_DIR/plugins/sfDoctrinePlugin/lib/vendor/doctrine/Doctrine/ > > > > > >Co > > > > > > > > >nnection.php * line 674 ... > > > > > <http://kontei/frontend_dev.php/task/update/id/1#> 1. . ' > > > > > (' . implode(', ', $cols) . ')' > > > > > 2. . ' VALUES (' . implode(', ', $a) . ')'; > > > > > 3. > > > > > 4. return $this->exec($query, array_values($fields)); > > > > > 5. } > > > > > 6. > > > > > 7. /** > > > > > - at *Doctrine_Connection->insert*(*object*('TaskCategoryTable'), * > > > > > array*('category_id' => '1', 'task_id' => '5')) > > > > > in * > > > > SF_SYMFONY_LIB_DIR/plugins/sfDoctrinePlugin/lib/vendor/doctrine/Doctrine/ > > > > > >Co > > > > > > > > >nnection/UnitOfWork.php * line 600 ... > > > > > <http://kontei/frontend_dev.php/task/update/id/1#> 1. > > > > > $record->assignIdentifier($id); > > > > > 2. } > > > > > 3. > > > > > 4. $this->conn->insert($table, $fields); > > > > > 5. > > > > > 6. if (empty($seq) && count($identifier) == 1 && > > > > > $identifier[0] == $table->getIdentifier() && > > > > > 7. $table->getIdentifierType() != Doctrine:: > > > > > IDENTIFIER_NATURAL) { > > > > > - at *Doctrine_Connection_UnitOfWork->processSingleInsert*(*object* > > > > > ('TaskCategory')) > > > > > in * > > > > SF_SYMFONY_LIB_DIR/plugins/sfDoctrinePlugin/lib/vendor/doctrine/Doctrine/ > > > > > >Co > > > > > > > > >nnection/UnitOfWork.php * line 559 ... > > > > > <http://kontei/frontend_dev.php/task/update/id/1#> 1. > > > > > $this->_insertCTIRecord($table, $record); 2. //-- > > > > > 3. } else { > > > > > 4. $this->processSingleInsert($record); > > > > > 5. } > > > > > 6. } > > > > > 7. > > > > > - at *Doctrine_Connection_UnitOfWork->insert*(*object* > > > > > ('TaskCategory')) > > > > > in * > > > > SF_SYMFONY_LIB_DIR/plugins/sfDoctrinePlugin/lib/vendor/doctrine/Doctrine/ > > > > > >Co > > > > > > > > >nnection/UnitOfWork.php * line 79 ... > > > > > <http://kontei/frontend_dev.php/task/update/id/1#> 1. > > > > > switch ($state) { > > > > > 2. case Doctrine_Record::STATE_TDIRTY: > > > > > 3. case Doctrine_Record::STATE_TCLEAN: > > > > > 4. $isValid = $this->insert($record); > > > > > 5. break; > > > > > 6. case Doctrine_Record::STATE_DIRTY: > > > > > 7. case Doctrine_Record::STATE_PROXY: > > > > > - at *Doctrine_Connection_UnitOfWork->saveGraph*(*object* > > > > > ('TaskCategory')) > > > > > in * > > > > SF_SYMFONY_LIB_DIR/plugins/sfDoctrinePlugin/lib/vendor/doctrine/Doctrine/ > > > > > >Re > > > > > > > > >cord.php * line 1318 ... < > > > > > > > > http://kontei/frontend_dev.php/task/update/id/1#> > > > > > > > > > 1. if ($conn === null) { > > > > > 2. $conn = $this->_table->getConnection(); > > > > > 3. } > > > > > 4. $conn->unitOfWork->saveGraph($this); > > > > > 5. } > > > > > 6. > > > > > 7. /** > > > > > - at *Doctrine_Record->save*() > > > > > in * > > > > SF_SYMFONY_LIB_DIR/plugins/sfDoctrinePlugin/lib/vendor/doctrine/Doctrine/ > > > > > >Re > > > > > > > > >cord.php * line 2053 ... < > > > > > > > > http://kontei/frontend_dev.php/task/update/id/1#> > > > > > > > > > 1. $record = new $modelClassName; > > > > > 2. $record[$localFieldName] = $identifier; > > > > > 3. $record[$foreignFieldName] = $id; > > > > > 4. $record->save(); > > > > > 5. } > > > > > 6. > > > > > 7. } else if ($rel instanceof > > > > > Doctrine_Relation_ForeignKey) { > > > > > > > > > > - at *Doctrine_Record->link*('Categories', *array*('1', '5')) > > > > > in *SF_ROOT_DIR/lib/form/doctrine/base/BaseTaskForm.class.php* line > > > > 128 > > > > > > > ... <http://kontei/frontend_dev.php/task/update/id/1#> > > > > > 1. $values = $this->getValue('categories_list'); > > > > > 2. if (is_array($values)) > > > > > 3. { > > > > > 4. $this->object->link('Categories', $values); > > > > > 5. } > > > > > 6. } > > > > > 7. > > > > > - at *BaseTaskForm->saveCategoriesList*(*object* > > > > > ('Doctrine_Connection_Mysql')) > > > > > in *SF_ROOT_DIR/lib/form/doctrine/base/BaseTaskForm.class.php* line > > > > 75 > > > > > > > ... <http://kontei/frontend_dev.php/task/update/id/1#> > > > > > 1. parent::doSave($con); > > > > > 2. > > > > > 3. $this->saveUsersList($con); > > > > > 4. $this->saveCategoriesList($con); > > > > > 5. } > > > > > 6. > > > > > 7. public function saveUsersList($con = null) > > > > > - at *BaseTaskForm->doSave*(*object*('Doctrine_Connection_Mysql')) > > > > > in * > > > > SF_SYMFONY_LIB_DIR/plugins/sfDoctrinePlugin/lib/form/sfFormDoctrine.class > > > > > >.p > > > > > > > > >hp * line 179 ... <http://kontei/frontend_dev.php/task/update/id/1#> > > > > > > > > -- > > > > > > > > Hugo Sarti > > > > > > > > Ingeniero en Sistemas de Información > > > > > > > > Syons > > > > > > > > www.syons.com.ar > > > > -- > > > > Hugo Sarti > > > > Ingeniero en Sistemas de Información > > > > Syons > > > > www.syons.com.ar > > -- Hugo Sarti Ingeniero en Sistemas de Información Syons www.syons.com.ar --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "symfony developers" group. To post to this group, send email to [email protected] To unsubscribe from this group, send email to [email protected] For more options, visit this group at http://groups.google.com/group/symfony-devs?hl=en -~----------~----~----~----~------~----~------~--~---
