Details
Description
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
.
Assigned to Guilherme