Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

ManyToManyPersister::loadCriteria IN operator bad translation #7793

Open
bednic opened this issue Aug 9, 2019 · 2 comments
Open

ManyToManyPersister::loadCriteria IN operator bad translation #7793

bednic opened this issue Aug 9, 2019 · 2 comments
Assignees

Comments

@bednic
Copy link

bednic commented Aug 9, 2019

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
Copy link
Author

bednic commented Aug 10, 2019

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
Copy link
Member

lcobucci commented Oct 2, 2019

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

2 participants