2010-02-21 105 views
4

現在我已經閱讀了所有的DQL文檔,我仍然有一些疑惑,我 試圖在我的DQL做一些嵌套的矛盾,但與DQL打 我似乎無法做到存檔他們嵌套條件與DQL

爲了讓自己更清楚:

我有這個DQL查詢

$q = Doctrine_Query::create() 
     ->select('c.nombre,c.webpage') 
     ->addSelect('COUNT(m.marca_id) as total_marcas') 
     ->from('Corporativos c') 
     ->leftJoin('c.Marcas m') 
     ->groupBy('c.corporativo_id') 
     ->where('ISNULL(c.deleted_at)') 
     ->orwhere('c.nombre LIKE :nombre', array(':nombre'=>'%'.$srch)) 
     ->orWhere('c.nombre LIKE :nombre', array(':nombre'=>'%'.$srch.'%')) 
     ->orWhere('c.nombre LIKE :nombre', array(':nombre'=>$srch.'%')) 
     ->orderBy('c.nombre ASC') 
     ->limit(0,20); 

現在這個生成以下MySQL查詢:

SELECT c.corporativo_id AS c__corporativo_id, c.nombre AS c__nombre, 
c.webpage AS c__webpage, COUNT(m.marca_id) AS m__0 FROM corporativos c 
LEFT JOIN marcas m ON c.corporativo_id = m.corporativo_id WHERE 
(ISNULL(c.deleted_at) OR c.nombre LIKE :nombre OR c.nombre 
LIKE :nombre OR c.nombre LIKE :nombre) GROUP BY c.corporativo_id ORDER 
BY c.nombre ASC 

但是我得到一組結果的情形之一deleted_at爲空 或其他條件完成後,我想使 ISNULL(deleted_at)強制性的,如果我們在SQL中的條款進行了交談 查詢應該是這樣的:

SELECT c.corporativo_id AS c__corporativo_id, c.nombre AS c__nombre, 
c.webpage AS c__webpage, COUNT(m.marca_id) AS m__0 FROM corporativos c 
LEFT JOIN marcas m ON c.corporativo_id = m.corporativo_id WHERE 
(ISNULL(c.deleted_at) AND (c.nombre LIKE :nombre OR c.nombre 
LIKE :nombre OR c.nombre LIKE :nombre)) GROUP BY c.corporativo_id 
ORDER BY c.nombre ASC 

你可以看到,我只是改變了第一或語句的AND和 增加了幾個圓括號來分組LIKE條件。

是否可以在DQL中使用相同的存檔來存檔 - > where() 表示法避免寫下整個條件?

謝謝:)

回答

1

您可以使用Doctrine_Query::andWhere,但我認爲這將因素帳單上的錯誤的方式,所以你可以建立你的查詢像

->where('c.nombre LIKE :nombre', array(':nombre'=>'%'.$srch)) 
->andWhere('ISNULL(c.deleted_at)') 
->orWhere('c.nombre LIKE :nombre', array(':nombre'=>'%'.$srch.'%')) 
->andWhere('ISNULL(c.deleted_at)') 
->orWhere('c.nombre LIKE :nombre', array(':nombre'=>$srch.'%')) 
->andWhere('ISNULL(c.deleted_at)') 

這是一種讓人毛骨悚然。

下面是修改學說另一種解決方案是能夠定製包圍:http://danielfamily.com/techblog/?p=37

+0

鏈接被破壞,這不是問題的實際解決方案。你可能想要更新它。 – pid 2015-07-14 08:31:03

5

不知道這變化是怎麼最近做了,但對於像我這樣的人來對這個問題尋找答案,這一問題被問多久,查詢生成器現在可以實現嵌套的AND/OR邏輯:andX()/orX() functions

+0

太棒了!謝謝。 – 2015-03-25 10:56:45

+0

這應該是被接受的答案。最近,SO正在遭受過時的回答。從長遠來看,它將比最新更爲陳舊。 – pid 2015-07-14 08:32:55

+0

我同意,這完全應該是被接受的答案。 – 2015-12-15 08:53:51