doctrine - 没有附加语句的地方

标签 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')
), true);

但是我正在构建的应用程序允许用户进行过滤。当发生这种情况时,我想在我的查询构建器中添加额外的 where 子句。稍后在代码中执行此行时,它会覆盖上面的 where 语句。

$qb->add('where',  $qb->expr()->like($col, $val), true );

根据我的阅读,第三个参数 $append 应该保留前面的语句,但是这并没有发生。在 Doctrine 1.2 中,我可以做这样的事情:

foreach($filter as $col => $val) {
    $dql->addWhere($col = ?, array($val));
}

如何向我的 QueryBuilder 动态添加 where 子句?

更新

完整声明

$where = array('col' => 'k.text', 'val' => 'some word%');

$qb = $this->entityManager->createQueryBuilder()
    ->select('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')
), true);

if ($where) {
    $qb->add('where', $qb->expr()->andx(
             $qb->expr()->like($where['col'], $where['val'])
    ), true);
}

$qb->addGroupBy('k.id');
    $qb->addGroupBy('s.id');

$qb->setFirstResult( $params['start'] )
   ->setMaxResults( $params['limit'] );

$q = $qb->getQuery();
echo $q->getSql();

输出是

SELECT s0_.id AS id0, k1_.id AS id1, k1_.name AS name2, k2_.id AS id3, k2_.name AS   name4, k3_.id AS id5, k3_.text AS text6, k3_.search_vol AS search_vol7, s4_.id AS id8, s4_.sub_domain AS sub_domain9, MIN(s0_.rank) AS sclr10, MAX(s0_.created) AS sclr11 
FROM section s0_ 
INNER JOIN keyword k3_ ON s0_.k_id = k3_.id 
INNER JOIN site s4_ ON s0_.s_id = s4_.id 
LEFT JOIN keyword_category k1_ ON k3_.k_cat_id = k1_.id 
LEFT JOIN keyword_sub_category k2_ ON k3_.k_subcat_id = k2_.id 
WHERE k3_.text LIKE 'some word%' 
GROUP BY k3_.id, s4_.id LIMIT 25 OFFSET 0

如果我不在 if ($where) 子句中添加,那么第一个 andx where 语句仍然存在。但是当我尝试动态添加它们时,只添加了最后的 WHERE 语句,所有其他的都被清除了。我还应该补充一点,我也这样尝试过。

if ($where) {
    $qb->add('where', $qb->expr()->like($where['col'], $where['val']), true);
}

我可以成功使用

$qb->andWhere( $qb->expr()->like($where['col'], $where['val']) );

但是查询生成器的 API 文档说明了我尝试使用它的方式也应该有效。想确保我做的是正确的,或者这是一个错误。

最佳答案

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

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

您应该在代码中注意一点:与其玩 ->add('where', ...),您应该考虑编程。向 andX() 对象添加更多项目,并在最后关联到 ->add('where', ...) (或者更好:->where(...))

关于doctrine - 没有附加语句的地方,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5985237/

相关文章:

symfony - 如何在 Symfony2 中进行 LIKE 数据库查询

ant - 在 ant 构建文件中执行命令行代码

php - 未找到 Doctrine 映射案例

php - 在 Doctrine2 上设置无限超时

php - 学说 2/MySQL : having trouble turning SQL left joins to DQL left joins

php - Symfony Doctrine Group By Query

mysql - FreeTDS UTF-8 插入 mysql

php - Symfony Form如何自动设置 child 的 parent

php - Symfony2 FOSRest 将值设置为空

php - DQL 选择具有一列 MAX 值的每一行