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 

--~--~---------~--~----~------------~-------~--~----~
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
-~----------~----~----~----~------~----~------~--~---

Reply via email to