我正在使用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')**
不知道這是否可能是任何事情的原因,但可能會嘗試刪除左連接的顯式列: - > leftJoin('Products p')...有時候學說確實會過度思考。總是有Doctrine RawSQL繞過這些奇怪的情況。 – Tom
注意,我注意到當我刪除限制語句時,它不再添加s.id IN()而不是s.id IS NULL。我會研究這個話題。謝謝湯姆,這並沒有改變結果。 –
我也看到這個,稍後會在doctrine源文件中做一些挖掘。令人沮喪。 –