Doctrine 其中没有附加语句

Doctrine 其中没有附加语句,doctrine,doctrine-orm,Doctrine,Doctrine Orm,我正在尝试动态地构建一个查询。它的初始状态很好。这是每个查询中应该出现的初始where子句 $qb->add('where',$qb->expr()->andx( $qb->expr()->eq('s.competitor',$competitor), $qb->expr()->eq('s.ignored',$ignored), $qb->expr()->eq('s.id',$params['s_id'), $qb->expr()->eq('s.id','k.targetSite') ),对);

我正在尝试动态地构建一个查询。它的初始状态很好。这是每个查询中应该出现的初始where子句

$qb->add('where',$qb->expr()->andx(
$qb->expr()->eq('s.competitor',$competitor),
$qb->expr()->eq('s.ignored',$ignored),
$qb->expr()->eq('s.id',$params['s_id'),
$qb->expr()->eq('s.id','k.targetSite')
),对);
但我正在构建的应用程序允许用户进行过滤。当这种情况发生时,我想在查询生成器中添加额外的where子句。当这一行稍后在代码中执行时,它将覆盖上面的where语句

$qb->add('where',$qb->expr()->like($col,$val),true);
据我所知,第三个参数
$append
应该保留前面的语句,但事实并非如此。在原则1.2中,我可以这样做:

foreach($col=>$val的过滤器){
$dql->addWhere($col=?,数组($val));
}
如何将where子句动态添加到QueryBuilder

更新

这是一份完整的声明

$where=array('col'=>'k.text','val'=>'some word%');
$qb=$this->entityManager->createQueryBuilder()
->选择('s,sc')
->from('Dashboard\Entity\Section','sc')
->innerJoin('sc.keyword','k')
->innerJoin('sc.site','s'))
->leftJoin('k.keywordCategory','kc')
->leftJoin('k.keywordSubCategory','ksc');
$qb->add('where',$qb->expr()->andx(
$qb->expr()->eq('s.competitor',$competitor),
$qb->expr()->eq('s.ignored',$ignored),
$qb->expr()->eq('s.id',$params['s_id'),
$qb->expr()->eq('s.id','k.targetSite')
),对);
如果($where){
$qb->add('where',$qb->expr()->andx(
$qb->expr()->like($where['col'],$where['val'])
),对);
}
$qb->addGroupBy('k.id');
$qb->addGroupBy('s.id');
$qb->setFirstResult($params['start']))
->setMaxResults($params['limit']);
$q=$qb->getQuery();
echo$q->getSql();
并且输出为

选择s0_u.id作为id0,k1_u.id作为id1,k1_u.name作为name2,k2_u.id作为id3,k2_u.name作为name4,k3_.id作为id5,k3_.id作为text6,k3_.search_uvol作为search_vol7,s4_.id作为id8,s4_u.sub_u域作为sub域9,MIN(s0_.rank)作为sclr10,MAX(s0_u.created)作为sclr11
来自第s0_节
内部连接关键字k3_0;ON s0_0;k_0;id=k3_0;id
内部连接站点s4_u在s0_u.s_uid=s4_u.id上
k3上的左连接关键字?类别k1?k?类别id=k1?类别id
k3上的左连接关键字_sub_category k2_.k_subcat_id=k2_u.id
其中k3.文本,如“some word%”
按k3_.id、s4_.id限制25偏移量0分组
如果我没有添加
If($where)
子句,那么第一个
andx
where语句仍然存在。但是,当我尝试动态添加它们时,只有最后的WHERE语句被添加,所有其他语句都被清除。我还要补充一点,我也是这样尝试的

if($where){
$qb->add('where',$qb->expr()->like($where['col'],$where['val']),true);
}
我可以成功地使用

$qb->andWhere($qb->expr()->类似($where['col'],$where['val']);
但是查询生成器的API文档说明了我尝试使用它的方式也应该是有效的。我想确定我做的是否正确,或者这是否是一个bug。

,看起来你试图做的似乎不起作用,尽管我认为这是在任何地方记录的,还是仅仅是一个bug还是一个问题

add()
中,您传入的DQL部分似乎只有在该部分已作为数组存储在查询生成器中时才会被追加:

   $isMultiple = is_array($this->_dqlParts[$dqlPartName]);
   ...

    if ($append && $isMultiple) {
        if (is_array($dqlPart)) {
            $key = key($dqlPart);

            $this->_dqlParts[$dqlPartName][$key][] = $dqlPart[$key];
        } else {
            $this->_dqlParts[$dqlPartName][] = $dqlPart;
        }
    } else {
        $this->_dqlParts[$dqlPartName] = ($isMultiple) ? array($dqlPart) : $dqlPart;
    }
与大多数其他DQL部分不同,WHERE子句未初始化为数组:

private $_dqlParts = array(
    'select'  => array(),
    'from'    => array(),
    'join'    => array(),
    'set'     => array(),
    'where'   => null,
    'groupBy' => array(),
    'having'  => null,
    'orderBy' => array()
);

现在,这看起来有点像它的设计,但第二条原则是相当新的,这一点似乎已经演变最近。就个人而言,我会针对这种行为提出一个bug,看看项目人员会怎么说。如果没有其他问题,您可能会得到改进的文档…

您可以正常使用->andWhere()(它还可以解决您的问题)

条令2 QueryBuilder是一个相当创新的概念(因为它混合了编程风格和流畅风格),并且可能存在与之相关的bug


您应该在代码中注意到一点:您应该考虑编程,而不是使用->添加('where',…)。将更多项添加到andX()对象,并在最后关联到->添加('where',…)(或者更好:->where(…)

您可以将生成的DQL语句粘贴到这里,并使用示例过滤器吗?我添加了我正在使用的完整语句。