学说:具有LIKE条件的多个或多个

时间:2014-10-11 21:45:42

标签: php sql symfony doctrine-orm

使用表格结构:

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

如何解决?我的错误在哪里?你有什么建议吗?

1 个答案:

答案 0 :(得分:3)

我无法确定,但在我看来这与参数标识符冲突。

这是你正在尝试做的事情:

  • 构建基本的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);)