【问题标题】:how to search array words with Doctrine DQL using bucle如何使用 bucle 使用 Doctrine DQL 搜索数组单词
【发布时间】:2014-12-03 10:59:50
【问题描述】:

我正在尝试以这种方式搜索存储在数组中的单词:

$dql_cat =' SELECT c
                FROM FrontendBundle:Categoria c
                WHERE';

        foreach ($palabras as $palabra){    

            if ($palabra === reset($palabras)){
                $dql_cat .= ' c.nombre LIKE %'.$palabra.'%';
            }
            else{
                $dql_cat .= ' OR c.nombre LIKE %'.$palabra.'%';
            }               
        }

        $dql_cat .= ' ORDER BY c.nombre';       
        $query = $em->createQuery($dql_cat);            
        $resultados['categorias'] = $query->getResult();

但我的查询出现异常。

查询结果:

选择 c FROM FrontendBundle:C 类 WHERE c.nombre LIKE %carpinteria% OR c.nombre LIKE %aluminio% ORDER BY c.nombre

查询异常:

QueryException:[语法错误] 第 0 行,第 98 列:错误:预期的 StateFieldPathExpression |字符串 |输入参数 |函数返回字符串 | AggregateExpression,得到'%'

我认为使用 queryBuilder 来避免错误更合适,但我不知道如何将它与参数数组一起使用。

我需要有或没有 queryBuilder 的解决方案。

谢谢。

【问题讨论】:

  • 您应该将 :paramX 传递给查询和查询对象调用 ->setParameter('paramX', '%'.$data.'%');
  • 感谢@Karol,但我已经知道如何使用 queryBuilder 设置参数,我不知道如何使用存储在数组中的多个参数。
  • 所以使用参数名称和数组的键并遍历这个数组来设置多个表达式。

标签: symfony doctrine-orm dql query-parameters


【解决方案1】:

queryBuilder 如下:

$qb = $em->createQueryBuilder();
        $qb->select('c')
            ->from('FrontendBundle:Categoria', 'c');

        foreach ($palabras as $palabra){
            if ($palabra === reset($palabras)){
                $qb->where($qb->expr()->like('c.nombre', $qb->expr()->literal('%' . $palabra . '%')));
            }                                       
            $qb->orWhere($qb->expr()->like('c.nombre', $qb->expr()->literal('%' . $palabra . '%')));
        }

        $query = $qb->orderBy('c.nombre', 'ASC')
        ->getQuery();

        $resultados['categorias'] = $query->getResult();

【讨论】:

  • 谢谢。我认为这个响应应该被标记为正确的答案。
  • 你的代码不安全,容易被sql注入。改为: $qb->where(c.nombre LIKE :palabra') $qb->setParameter('palabra', '%'.$palabra.'%')
【解决方案2】:

%$palabra%开头应该被引用,对吧?:

    foreach ($palabras as $palabra){    

        if ($palabra === reset($palabras)){
            $dql_cat .= " c.nombre LIKE '%".$palabra."%'";
        }
        else{
            $dql_cat .= " OR c.nombre LIKE '%".$palabra."%'";
        }               
    }

【讨论】:

  • 谢谢@devilcius,我已经测试并放弃了这种方式,因为我自己的错误是错误地写了引号:$dql_cat .= ' c.nombre LIKE "%'.$palabra.'%"';再次感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多