Doctrine 2 - ORM
  1. Doctrine 2 - ORM
  2. DDC-1341

MultiTableUpdateExecutor does not bind parameters properly


    • Type: Bug Bug
    • Status: Resolved
    • Priority: Blocker Blocker
    • Resolution: Fixed
    • Affects Version/s: Git Master
    • Fix Version/s: 2.1.2
    • Component/s: ORM
    • Security Level: All
    • Labels:


      Hi, I found really annoing bug in multi table update executor, it doesn't bind parameters properly. I have following structure of entities (afaik not really important, bug should appear with any class inheritance structure)

      * @entity
      * @inheritanceType("JOINED")
      * @discriminatorColumn(name="type", type="string")
      * @discriminatorMap({"NodeEntity", forum = "ForumEntity"})
      class NodeEntity
        // ... some params
      * @entity
      class ForumEntity
      * @manyToOne(targetEntity="Author")
      private $lastPostAuthor;
      * @column(type="datetime")
      private $tLastPost;
      // ... some params

      And I'm trying to run following query

      $qb = $this->entityManager->createQueryBuilder()
      			->update('ForumEntity', 'f')
      			->set('f.nPosts', 'f.nPosts + 1')
      			->set('f.tLastPost', ':tLastPost')->setParameter('tLastPost', $post->getTCreation()) // $post->getTCreation() returns an instance of DateTime
      			->set('f.lastPostAuthor', ':author')->setParameter('author', $post->getAuthor()) // $post->getAuthor() returns an instance of AuthorEntity
      			->where('f.lft <= :left')->setParameter('left', $forum->getLft())
      			->andWhere('f.rgt >= :right')->setParameter('right', $forum->getRgt())
      			->andWhere('f.root = :root')->setParameter('root', $forum->getRoot());

      Which fails with "recoverable error", because Doctrine tries to convert value of parameter 'right' to datetime. I have learned why it does so, it is because of line 157 in already mentioned MultiTableUpdateExecutor - while parameters for the insert query are sliced of parameters from update clause, their types are not. And that is a bit problematic.

      But that is not the only problem, if you look at line 161, the update query receives parameters as they were binded to QueryBuilder, so when I bind there an object, the update query receives the object instead of his identificator. That leads to error like "object ... could not be converted to string". And also, the update query does not receive any information about type of parameters, but I'm not sure if that is also a bug.

      I'm not a native english speaker so if I explain things chaotically, just say so please, I'll try better .


        Benjamin Eberlei added a comment -

        Assigned to Guilherme

        Benjamin Eberlei added a comment - Assigned to Guilherme
        Guilherme Blanco added a comment - Fixed since this commit:
        Benjamin Eberlei added a comment -

        Merged into 2.1.x

        Benjamin Eberlei added a comment - Merged into 2.1.x


          • Assignee:
            Guilherme Blanco
            Pavel Kučera
          • Votes:
            0 Vote for this issue
            0 Start watching this issue


            • Created: