Доктрина: многократная или с условием LIKE

Использовать таблицу со структурой:

id | count /string/id1 | 3 /string/id1/r1 | 2 /string/id1/r2 | 1 /string/id2/r1 | 2 /string/id2 | 3 /string/id2/r1 | 2 /string/id3/r1 | 5 

и я хочу выбрать все строки, которые нуждаются в подстроке в id .
т.е. мне нужны все строки, которые имеют подстроку в id: / string / id1 и / string / id2

Запрос должен быть простым – простой sql:

 select * from table_name where id LIKE '/string/id1%' OR id LIKE '/string/id2%'; 

Результат должен быть:

 id | count /string/id1 | 3 /string/id1/r1 | 2 /string/id1/r2 | 1 /string/id2/r1 | 2 /string/id2 | 3 /string/id2/r1 | 2 

К сожалению, если вы попытаетесь использовать тот же запрос в symfony и doctrine2:

 $ids = array('/string/id1', '/string/id2'); $query = $this->createQueryBuilder('r') ->select('r'); foreach ($ids as $id) { $query->orWhere("r.linkedId LIKE :id ") ->setParameter('id', $id."%"); } $plainQuery = $query->getQuery()->getSQL(); $results = $query->getQuery()->getResult(); 

Обычный запрос выглядит так же, как select * from table_name where id LIKE '/string/id1%' OR id LIKE '/string/id2%'; , но результатов нет.

результаты содержат только строки последнего элемента в ids – / string / id2

 id | count /string/id2/r1 | 2 /string/id2 | 3 /string/id2/r1 | 2 

Как его решить? Где моя ошибка? Есть ли у вас предложения?

Я не могу быть уверен, но это кажется мне конфликтом с идентификаторами параметров.

Это то, что вы пытаетесь сделать:

  • Построить базовый SELECT * FROM table_name
  • Добавить WHERE r.linkedId LIKE :id
  • установите значение параметра id в /string/id1%
  • Добавить OR r.linkedId LIKE :id
  • установите значение параметра id в /string/id2% (переопределите предыдущее значение) <- AN ERROR

В основном, вы сообщаете Doctrine, чтобы переопределить ранее определенное значение параметра id с новым.

Вы можете легко преодолеть эту проблему. Просто добавьте $i к имени параметра

 foreach ($ids as $i => $id) { // $i here has the value of 0,1,2, etc... $query->orWhere("r.linkedId LIKE :id$i" ) // append $i ->setParameter("id$i", $id."%"); // but also append it here } 

Обязательно используйте двойные кавычки или конкатенируйте ( "id" . $i ) вместо;)