使用具有以下结构的表:
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%
(覆盖以前的值)<--错误
基本上,您是在告诉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
);)