2012-06-08 47 views
1

我正在使用MySQL數據庫和Doctrine 1.1.2。爲什麼「s.d IS NULL」在Doctrine 1.1.2(使用leftJoin)中使用DQL添加到我的where子句中?

我想用leftJoin寫一個查詢,我試圖理解結果,因爲它給了我多次問題。在我運行了幾個不同的測試之後,它似乎幾乎是間歇性的,我不相信它可以。

下面,我將粘貼到DQL中以創建查詢以及它們的輸出。這四個例子是我在試圖理解爲什麼添加「s.id IS NULL」的時候創建的例子,以及爲什麼有時候「s.id IN('184158')」。如果兩者都沒有添加,我會好起來的,但有人可以向我解釋爲什麼它在那裏,也許我可以告訴DQL我不需要它?

從我所做的一些研究中,我收集到它可能是錯誤修復(#1868)的一部分,關於該查詢是否包含子查詢。但是,由於這沒有子查詢,所以我不知道如何推動測試這個問題。

這裏是bug修復#1868年在教義/ lib目錄/教義/ Query.php

// FIX #1868: If not ID under MySQL is found to be restricted, restrict pk column for null 
//   (which will lead to a return of 0 items) 
$limitSubquerySql = $this->_conn->quoteIdentifier($field) 
    . ((! empty($subquery)) ? ' IN (' . $subquery . ')' : ' IS NULL') 
    . ((count($this->_sqlParts['where']) > 0) ? ' AND ' : ''); 

請和謝謝你的代碼。

$query = Doctrine_Query::create() 
    ->select('s.id, p.id') 
    ->from('Submission s') 
    ->leftjoin('s.Products p ON s.product_id = p.id') 
    ->where('s.id = ?',$id) 
    ->limit(1); 
echo $query->getSqlQuery() . '< br />'; 

$query = Doctrine_Query::create() 
    ->select('s.id, p.id, p.field1') 
    ->from('Submission s') 
    ->leftjoin('s.Products p ON s.product_id = p.id') 
    ->where('s.id = ?',$id) 
    ->limit(1); 
echo $query->getSqlQuery() . '< br />'; 

$query = Doctrine_Query::create() 
    ->select('s.id, p.id, p.field1, p.field2') 
    ->from('Submission s') 
    ->leftjoin('s.Products p ON s.product_id = p.id') 
    ->where('s.id = ?',$id) 
    ->limit(1); 
echo $query->getSqlQuery() . '< br />'; 

$query = Doctrine_Query::create() 
    ->select('s.id, p.id, p.field1, p.field2, p.field3') 
    ->from('Submission s') 
    ->leftjoin('s.Products p ON s.product_id = p.id') 
    ->where('s.id = ?',$id) 
    ->limit(1); 
echo $query->getSqlQuery() . '< br />';  

**-- OUTPUT --** 
**-- $id = 184158** 

SELECT s.id AS s__id, p.id AS p__id 
FROM submission s 
LEFT JOIN products p 
ON (s.prodid = p.id) 
WHERE **s.id IS NULL** AND (s.id = 184158) **<-- Notice the s.id IS NULL** 

SELECT s.id AS s__id, p.id AS p__id, p.field1 AS p__field1 
FROM submission s 
LEFT JOIN products p 
ON (s.prodid = p.id) 
WHERE **s.id IN ('184158')** AND (s.id = 184158) **<-- Notice the s.id IN ('184158')** 

SELECT s.id AS s__id, p.id AS p__id, p.field1 AS p__field1, p.field2 AS p__field2 
FROM submission s 
LEFT JOIN products p 
ON (s.prodid = p.id) 
WHERE **s.id IS NULL** AND (s.id = 184158) **<-- Notice the s.id IS NULL** 

SELECT s.id AS s__id, p.id AS p__id, p.field1 AS p__field1, p.field2 AS p__field2, p.field3 AS p__field3 
FROM submission s 
LEFT JOIN products p 
ON (s.prodid = p.id) 
WHERE **s.id IN ('184158')** AND (s.id = 184158) **<-- Notice the s.id IN ('184158')** 
+0

不知道這是否可能是任何事情的原因,但可能會嘗試刪除左連接的顯式列: - > leftJoin('Products p')...有時候學說確實會過度思考。總是有Doctrine RawSQL繞過這些奇怪的情況。 – Tom

+1

注意,我注意到當我刪除限制語句時,它不再添加s.id IN()而不是s.id IS NULL。我會研究這個話題。謝謝湯姆,這並沒有改變結果。 –

+0

我也看到這個,稍後會在doctrine源文件中做一些挖掘。令人沮喪。 –

回答

1

出現這種情況的原因有幾個原因:

1)學說涉及對象不「行」,所以當你添加一個加入它會立即需要的不僅僅是一個簡單的限制多說了,你想有一個單一的(fetchOne)對象中,這些關係會添加到SQL中的行數中,因此Doctrine在2個階段中執行它。

table1.id table2.id 
1,11 
1,12 
2,11 
2,13 
2,22 
3,33 

假設你問fetchOne那麼它將獲得2行,但1個對象將水合(對於「ID = 1」行)

2)如果您的查詢發現沒有那麼DQL會什麼都不知道將匹配,因此增加了id = NULL,或者如果它發現的東西把它添加IN (id-that-is-first)

我有同樣的問題,在這裏帶領我,它原來的查詢只是不返回任何東西。希望這可以幫助。

相關問題