如何使用Doctrines Query Builder定义多个orWhere查询

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使用Doctrines Query Builder定义多个orWhere查询相关的知识,希望对你有一定的参考价值。

我想使用Doctrines QueryBuilder创建一个查询。

用户可以通过选中或取消选中html表单中的复选框来选择要搜索的数据库字段。这就是为什么$_POST contains 'filters'和'喜欢'。

$_POST['filters']看起来像这样:

array(2) { [0]=> string(4) "rack" [1]=> string(5) "shelf" } 

我试图让以下查询工作导致

SELECT * FROM `inventories` WHERE (`rack` OR `shelf` LIKE '%01%') AND `checkedOutAt` IS NULL ORDER BY `lastChangedAt`

我在版本2.5.5中使用Doctrine,在版本7中使用php。我的控制器如下所示:

public function searchAction()
{
    $filters = array();
    $em = $this->getEntityManager();
    $vendors = $em->getRepository('Entities\Vendor')->findAll();

    if ($_POST)
    {
        $filters = $_POST['filters'];
        $like = trim($_POST['like']);
        $inventories = $em
            ->getRepository('Entities\Inventory')
            ->findInventoriesBySearch($like, $filters)
        ;
        $this->addContext('like', $like);
    }
    else
    {
        $inventories = $em
            ->getRepository('Entities\Inventory')
            ->findInventories()
        ;
    }

    $count = count($inventories);

    $this->addContext('filters', $filters);
    $this->addContext('vendors', $vendors);
    $this->addContext('inventories', $inventories);
    $this->addContext('count', $count);
    $this->setTemplate('inventoryAction');
}

并且相应的存储库(“findInventories()”存储库函数工作正常):

public function findInventoriesBySearch($like, $filters)
{
    $em = $this->getEntityManager();
    $orExpr = $qb->expr()->orX();

    foreach ($filters as $filter)
    {
        $orExpr->add($qb->expr()->like($filter, $like));
    }

    $qb ->andWhere('i.checkedOutAt is NULL');
    $qb->setParameter('like', '%' . $like . '%');
    $qb->select('i')->where($orExpr)->addOrderBy('i.lastChangedAt', 'DESC');

    return $qb->getQuery()->getResult();
}

当我运行脚本时,我收到以下错误消息:

致命错误:Uncaught Doctrine \ ORM \ Query \ QueryException:SELECT i WHERE rack LIKE 01 OR shelf LIKE 01 ORDER by i.lastChangedAt DESC in ... / vendor / doctrine / orm / lib / Doctrine / ORM / Query / QueryException.php :41堆栈跟踪:#0 ... / vendor / doctrine / orm / lib / Doctrine / ORM / Query / Parser.php(483):Doctrine \ ORM \ Query \ QueryException :: dqlError('SELECT i WHERE ... ')#1 ... / vendor / doctrine / orm / lib / Doctrine / ORM / Query / Parser.php(971):Doctrine \ ORM \ Query \ Parser-> semanticalError('line 0,col 15 ......' ,数组)#2 ... / vendor / doctrine / orm / lib / Doctrine / ORM / Query / Parser.php(1702):Doctrine \ ORM \ Query \ Parser-> AbstractSchemaName()#3 ... / vendor / doctrine / orm / lib / Doctrine / ORM / Query / Parser.php(1557):Doctrine \ ORM \ Query \ Parser-> RangeVariableDeclaration()#4 ... / vendor / doctrine / orm / lib / Doctrine / ORM / Query /Parser.php(1292):第63行的... / vendor / doctrine / orm / lib / Doctrine / ORM / Query / QueryException.php中的Doctrine \ ORM \ Query \ Parser-> IdentificationVariableDeclaration()

答案

尝试检查并更改它。

  1. (只是一个建议)不要使用$_POST /请求类型/访问它/ etc。通过“你的方式”。使用typehinted Request例如: public function searchAction(Request $request){ if ($request->isMethod('POST')) { $filters = $request->request->get('filters'); //..... }else{ } }
  2. 猜猜看,问题是: //... foreach ($filters as $filter) { $filter = 'i.'.$filter; // <== 'i.rack','i.shelf', so on $orExpr->add($qb->expr()->like($filter, $like)); }

以上是关于如何使用Doctrines Query Builder定义多个orWhere查询的主要内容,如果未能解决你的问题,请参考以下文章

http_build_query()函数使用方法

http_build_query()函数使用方法

http_build_query()函数使用方法

http_build_query用法

php使用http_build_query,parse_url,parse_str创建与解析url详解

url格式化函数http_build_query() 和parse_str() 函数