我使用的是MySQL数据库和Doctrine 1.1.2。
我正在尝试编写一个带有leftJoin的查询,并且我正在尝试理解结果,因为它多次给我带来问题。在我运行了几个不同的测试之后,它似乎几乎是断断续续的,我不相信这是可能的。
下面,我将粘贴用于创建查询的DQL和它们的输出。这四个例子是我在试图理解为什么添加"s.id IS NULL“时创建的,以及为什么有时添加"s.id IN ('184158')”。如果这两个都没有添加,我会很好,但是有人可以解释为什么它在那里,也许我如何告诉DQL我不想要它?
根据我所做的一些研究,我猜测它可能是关于此查询是否包含子查询的错误修复(#1868)的一部分。但是,由于这没有子查询,我不知道如何继续测试这个问题。
以下是doctrine/lib/Doctrine/Query.php中错误修复#1868的代码
// 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')**
发布于 2012-11-29 23:25:51
这是由以下几个原因造成的:
1) Doctrine处理的是对象,而不是“行”,所以当你添加一个连接时,它立即需要的不仅仅是一个简单的限制,比如,你想要一个具有一对多关系的表的单个(fetchOne)对象,这些关系加上SQL中的行数,所以Doctrine分两个阶段来做。
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)
我也遇到了同样的问题,把我带到了这里,结果发现查询没有返回任何东西。希望这能有所帮助。
https://stackoverflow.com/questions/10952818
复制相似问题