Orm: ManyToManyPersister::loadCriteria IN operator bad translation

Created on 9 Aug 2019  路  2Comments  路  Source: doctrine/orm

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;
            }
Bug Missing Tests

Most helpful comment

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 馃槥

All 2 comments

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 馃槥

@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:

Was this page helpful?
0 / 5 - 0 ratings