首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么在Doctrine 1.1.2 (使用leftJoin)中使用DQL将"s.d is NULL“添加到我的where子句?

为什么在Doctrine 1.1.2 (使用leftJoin)中使用DQL将"s.d is NULL“添加到我的where子句?
EN

Stack Overflow用户
提问于 2012-06-09 00:39:55
回答 1查看 376关注 0票数 2

我使用的是MySQL数据库和Doctrine 1.1.2。

我正在尝试编写一个带有leftJoin的查询,并且我正在尝试理解结果,因为它多次给我带来问题。在我运行了几个不同的测试之后,它似乎几乎是断断续续的,我不相信这是可能的。

下面,我将粘贴用于创建查询的DQL和它们的输出。这四个例子是我在试图理解为什么添加"s.id IS NULL“时创建的,以及为什么有时添加"s.id IN ('184158')”。如果这两个都没有添加,我会很好,但是有人可以解释为什么它在那里,也许我如何告诉DQL我不想要它?

根据我所做的一些研究,我猜测它可能是关于此查询是否包含子查询的错误修复(#1868)的一部分。但是,由于这没有子查询,我不知道如何继续测试这个问题。

以下是doctrine/lib/Doctrine/Query.php中错误修复#1868的代码

代码语言:javascript
运行
复制
// 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 ' : '');  

谢谢你,谢谢。

代码语言:javascript
运行
复制
$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')**  
EN

回答 1

Stack Overflow用户

发布于 2012-11-29 23:25:51

这是由以下几个原因造成的:

1) Doctrine处理的是对象,而不是“行”,所以当你添加一个连接时,它立即需要的不仅仅是一个简单的限制,比如,你想要一个具有一对多关系的表的单个(fetchOne)对象,这些关系加上SQL中的行数,所以Doctrine分两个阶段来做。

代码语言:javascript
运行
复制
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)

我也遇到了同样的问题,把我带到了这里,结果发现查询没有返回任何东西。希望这能有所帮助。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10952818

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档