Как сделать запрос из нескольких столбцов WHERE IN в построителе запросов Doctrine?

Я хотел бы обновить несколько записей в БД, используя оператор WHERE IN с проверкой двух столбцов.

Чистый необработанный запрос MySql выглядит примерно так... и он работает:

UPDATE poll_quota q SET q.count = q.count+1 WHERE q.form_id=14 AND ((q.field_id,q.value) IN (('A',1),('B',1)))

Мой код:

$this->createQueryBuilder("q")
            ->update()
            ->set("q.count","q.count+1")
            ->where("q.form_id=:form_id")
            ->andWhere("((q.field_id,q.value) IN (:wherein))")
            ->setParameter(":form_id",$form_id)
            ->setParameter(":wherein",$where_in)
            ->getQuery()
            ->execute()
        ;

Выход:

[Syntax Error] line 0, col 103: Error: Expected Doctrine\ORM\Query\Lexer::T_CLOSE_PARENTHESIS, got ','

[1/2] QueryException: UPDATE Edge\PollBundle\Entity\Quota q SET q.count = q.count+1 WHERE q.form_id=:form_id AND ((q.field_id,q.value) IN (:wherein))   +

Попытка сделать что-то вроде этого тоже не работает:

[...]->andWhere("((q.field_id,q.value) IN ({$where_in}))")

$where_in содержит такую ​​строку:

"('A',1),('B',1)"

person Tomk    schedule 15.07.2015    source источник
comment
Не могли бы вы просто использовать ->andWhere("q.field_id IN (:wherein)")->andWhere("q.value IN (:wherein)")?   -  person qooplmao    schedule 16.07.2015
comment
Скрипт обновляет только выбранные пары field_id и value. В этом случае отдельные операторы IN не будут работать.   -  person Tomk    schedule 16.07.2015
comment
Я не думаю, что действительно понимаю, что делает/будет делать скрипт, к сожалению.   -  person qooplmao    schedule 16.07.2015


Ответы (1)


DQL не позволяет использовать несколько столбцов в операторе WHERE IN, поскольку это поддерживают не все СУБД. Вы можете запустить его с необработанным SQL, используя $this->getEntityManager()->getConnection()->executeUpdate()

person Kevin Sharp    schedule 15.07.2015
comment
Я боялся, что это проблема. Спасибо за помощь - person Tomk; 15.07.2015