DDC-1341: MultiTableUpdateExecutor does not bind parameters properly #1958

Closed
doctrinebot opened this Issue Aug 21, 2011 · 4 comments

2 participants

@doctrinebot

Jira issue originally created by user pave.kucera:

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());

        $qb->getQuery()->execute();

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 :).

@doctrinebot

Comment created by @beberlei:

Assigned to Guilherme

@doctrinebot

Comment created by @guilhermeblanco:

Fixed since this commit: e7f471e

@doctrinebot

Issue was closed with resolution "Fixed"

@doctrinebot

Comment created by @beberlei:

Merged into 2.1.x

@doctrinebot doctrinebot added this to the 2.1.2 milestone Dec 6, 2015
@doctrinebot doctrinebot closed this Dec 6, 2015
@doctrinebot doctrinebot added the Bug label Dec 7, 2015
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment