Использовать таблицу со структурой:
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
) вместо;)