【问题标题】:Doctrine: Multiple orWhere with LIKE conditionDoctrine: Multiple orWhere with LIKE 条件
【发布时间】:2014-10-11 21:45:41
【问题描述】:

使用带结构的表:

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 和教义 2 中使用相同的查询:

$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%';,但结果却不是。

results 仅包含 ids 中最后一项的行 - /string/id2

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

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

【问题讨论】:

  • 如果您运行原始查询,phpMyAdmin 会显示什么?它是否包括正确的结果?如果是这样,这似乎是您实体的 linkedId 字段上的映射问题。

标签: php sql symfony doctrine-orm


【解决方案1】:

我不能确定,但​​这在我看来是与参数标识符的冲突。

这就是你想要做的:

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

【讨论】:

    猜你喜欢
    • 2011-04-06
    • 2021-07-12
    • 2015-03-02
    • 2012-02-24
    • 1970-01-01
    • 1970-01-01
    • 2015-02-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多