gpt4 book ai didi

doctrine - 没有附加语句的地方

转载 作者:行者123 更新时间:2023-12-01 11:05:55 25 4
gpt4 key购买 nike

我正在尝试动态构建查询。它的初始状态很好。这是每个查询中应该出现的初始 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com