Php 如何使用Doctrines查询生成器定义多个或多个查询

Php 如何使用Doctrines查询生成器定义多个或多个查询,php,doctrine-orm,query-builder,Php,Doctrine Orm,Query Builder,我想使用Doctrines QueryBuilder创建一个查询 用户可以选择通过选中或取消选中HTML表单中的复选框来搜索的数据库字段。这就是为什么$\u POST包含“filters”和“like” $\u POST['filters']如下所示: array(2) { [0]=> string(4) "rack" [1]=> string(5) "shelf" } public function searchAction() { $filters = array()

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

用户可以选择通过选中或取消选中HTML表单中的复选框来搜索的数据库字段。这就是为什么
$\u POST包含“filters”和“like”

$\u POST['filters']
如下所示:

array(2) { [0]=> string(4) "rack" [1]=> string(5) "shelf" } 
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');
}
我试图得到以下查询工作的结果

SELECT * FROM `inventories` WHERE (`rack` OR `shelf` LIKE '%01%') AND `checkedOutAt` IS NULL ORDER BY `lastChangedAt`
我在2.5.5版中使用了条令,在7版中使用了PHP。我的控制器如下所示:

array(2) { [0]=> string(4) "rack" [1]=> string(5) "shelf" } 
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()”存储库函数工作正常):

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

致命错误:未捕获条令\ORM\Query\QueryException:选择i 其中,货架类01或货架类01由i.lastChangedAt DESC订购 …/vendor/doctor/orm/lib/doctor/orm/Query/QueryException.php:41 堆栈跟踪:#0 …/vendor/doctor/orm/lib/doctor/orm/Query/Parser.php(483): 条令\ORM\Query\QueryException::dqlError('SELECT i WHERE…')#1 …/vendor/doctor/orm/lib/doctor/orm/Query/Parser.php(971): 条令\ORM\Query\Parser->semanticaleror('第0行,第15列…', 数组)#2 …/vendor/doctor/orm/lib/doctor/orm/Query/Parser.php(1702): 条令\ORM\Query\Parser->AbstractSchemaName()#3 …/vendor/doctor/orm/lib/doctor/orm/Query/Parser.php(1557): 条令\ORM\Query\Parser->RangeVariableDeclaration() …/vendor/doctor/orm/lib/doctor/orm/Query/Parser.php(1292): 中的条令\ORM\Query\Parser->IdentificationVariableDeclaration() …/vendor/doctrine/orm/lib/doctrine/orm/Query/QueryException.php 第63行


尝试检查并更改它

  • (只是一个建议)不要通过“你的方式”使用
    $\u POST
    /请求类型/访问权限/等等。使用类型提示的
    请求
    ,例如:

    public function searchAction(Request $request){
    
       if ($request->isMethod('POST')) {
         $filters = $request->request->get('filters');
    
         //.....
       }else{
    
       }
    }
    
  • 我猜,问题是:

    //...
    foreach ($filters as $filter)
    {
       $filter = 'i.'.$filter; // <== 'i.rack','i.shelf', so on
       $orExpr->add($qb->expr()->like($filter, $like));
    }
    
    /。。。
    foreach($filters作为$filter)
    {
    $filter='i..$filter;//添加($qb->expr()->like($filter,$like));
    }
    

  • 你检查过了吗?我刚试过,但不幸的是还是不行。我收到相同的错误消息,但此部分除外:“选择I WHERE I.rack LIKE 01或I.shelf LIKE 01 ORDER BY I.lastChangedAt DESC”