doctrine / orm

Doctrine Object Relational Mapper (ORM)
https://www.doctrine-project.org/projects/orm.html
MIT License
9.92k stars 2.51k forks source link

ManyToManyPersister::loadCriteria IN operator bad translation #7793

Open bednic opened 5 years ago

bednic commented 5 years ago

Bug Report

Q A
BC Break no
Version 2.6.3

Summary

Current behavior

If you use Criteria::exp()->in() on relation collection, in this case ManyToMany, the query built in method ::loadCriteria translate are wrong.

        foreach ($parameters as $parameter) {
            [$name, $value, $operator] = $parameter;

            $field          = $this->quoteStrategy->getColumnName($name, $targetClass, $this->platform);
            $whereClauses[] = sprintf('te.%s %s ?', $field, $operator);
            $params[]       = $value;
        }

are translated to this

 WHERE t.region_id = ? AND te.status IN ?' with params [1, ["finished","error"]]

but should end up like this

WHERE t.region_id = ? AND te.status IN (?,?)' with params [1, ["finished","error"]]

How to reproduce

Expected behavior

It should be enough if someone add something like this:

            if (is_array($value)) {
                $whereClauses[] = sprintf('te.%s IN (' . str_repeat('?,', count($value) - 1) . '?)', $field);
                $params         = array_merge($params, $value);
            }
            else {
                $whereClauses[] = sprintf('te.%s %s ?', $field, $operator);
                $params[]       = $value;
            }
bednic commented 5 years ago

After deep inspect I suppose whole ManyToManyPersister should be reworked. It works with database but missing all SQL translation techniks from BasicEntityPersister, so most of advanced queries are invalid. For example LIKE is translated to CONTIANS, IN don't expand parameters before query execution. There is a lot of work 😞

lcobucci commented 4 years ago

@bednic would you be able to send us a failing functional test case that reproduces this issue (targetting 2.6)? It would help us a lot to find a way to fix things :+1: