我試圖動態生成一個查詢。它的初始狀態很好。這是每個查詢應該出現的初始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));
}
如何動態添加Where子句到我的QueryBuilder?
更新
這是一個完整的語句
$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語句,其他所有語句都會被清除。我還應該補充一點,我也是這樣嘗試的。
if ($where) {
$qb->add('where', $qb->expr()->like($where['col'], $where['val']), true);
}
我可以成功地使用
$qb->andWhere($qb->expr()->like($where['col'], $where['val']));
但API文檔的查詢生成器的狀態我想使用它應該是太有效的方式。希望確保我做得對,或者如果它是一個錯誤。
您可以粘貼生成的DQL聲明在這裏,一個例子過濾器? – Cobby 2011-05-13 02:19:19
我添加了我正在使用的完整聲明。 – Nathan 2011-05-13 02:43:24