Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 在Symfony2中使用查询生成器实现SQL联合查询_Php_Sql_Symfony_Doctrine_Query Builder - Fatal编程技术网

Php 在Symfony2中使用查询生成器实现SQL联合查询

Php 在Symfony2中使用查询生成器实现SQL联合查询,php,sql,symfony,doctrine,query-builder,Php,Sql,Symfony,Doctrine,Query Builder,我目前正在使用Symfony2框架。我不知道如何通过Symfony2中的查询生成器连接我的查询中的2个,我只能使用SQL联合查询连接它们。下面是返回正确结果的查询 SELECT * FROM (SELECT m.id, m.subject, m.date FROM message m JOIN message_incoming mi ON m.id = mi.id WHERE m.recipient_id = 1 AND mi.trash = 1 AND mi.deleted = 0) AS

我目前正在使用Symfony2框架。我不知道如何通过Symfony2中的查询生成器连接我的查询中的2个,我只能使用SQL联合查询连接它们。下面是返回正确结果的查询

SELECT * FROM (SELECT m.id, m.subject, m.date 
FROM message m JOIN message_incoming mi ON m.id = mi.id
WHERE m.recipient_id = 1
AND mi.trash = 1
AND mi.deleted = 0) AS y
UNION 
SELECT * FROM (SELECT m.id, m.subject, m.date 
FROM message m JOIN message_outgoing mo ON m.id = mo.id
WHERE m.originator_id = 1
AND mo.trash = 1
AND mo.sent = 1
AND mo.deleted = 0) AS z
ORDER BY date DESC
我试图在一个查询中加入这段代码(没有联合)以获得正确的结果,但失败了

那么如何使用查询生成器实现这个查询呢


请提供建议,谢谢。

编写此类查询而不必对Doctrine2本身进行太多攻击的最佳方法是使用


本机/sql
QueryBuilder
使用与ORM完全相同的API。您可以将结果映射到现有实体。

我不知道在不检查条件的情况下加入两个查询时我有多愚蠢。 这是正确的查询:

SELECT m.id, m.subject, m.date
FROM message m 
JOIN message_incoming mi ON m.id = mi.id
JOIN message_outgoing mo ON m.id = mo.id
WHERE m.recipient_id = 1
AND mi .trash = 1
AND mi .deleted = 0
OR m.originator_id = 1
AND mo .trash = 1
AND mo .deleted =0
AND mo .sent = 1
ORDER by date DESC
我尝试通过查询生成器实现它:

$queryBuilder = $this->entityManager->getRepository('EzxWebmailBundle:Message')
            ->createQueryBuilder('m')
            ->select('m.id','m.subject','m.date')
            ->join('m.message_outgoing','mo','ON','m.id = mo.id')
            ->join('m.message_incoming','mi','ON','m.id = mi.id')
            ->where('m.recipient_id = '.$userId)
            ->andWhere('mi.trash = 1')
            ->andWhere('mi.deleted = 0')
            ->orWhere('m.originator_id = '.$userId)
            ->andWhere('mo.trash = 1')
            ->andWhere('mo.deleted = 0')
            ->andWhere('mo.sent = 1')
            ->orderBy('m.date','DESC');
$result = $queryBuilder->getQuery()->getResult();
多么令人惊讶的是,它返回了错误的结果!因此,我尝试查看使用以下方法生成的查询:

var_dump($queryBuilder->getQuery());
当我得到这个结果时,我真的不知道为什么条令会产生额外的括号(仔细看看WHERE子句):

因此,如果我添加我自己的父项,则这必须是正确的:

$queryBuilder = $this->entityManager->getRepository('EzxWebmailBundle:Message')
            ->createQueryBuilder('m')
            ->select('m.id','m.subject','m.date')
            ->join('m.message_outgoing','mo','ON','m.id = mo.id')
            ->join('m.message_incoming','mi','ON','m.id = mi.id')
            ->where('(m.recipient_id = '.$userId)
            ->andWhere('mi.trash = 1')
            ->andWhere('mi.deleted = 0)')
            ->orWhere('(m.originator_id = '.$userId)
            ->andWhere('mo.trash = 1')
            ->andWhere('mo.deleted = 0')
            ->andWhere('mo.sent = 1)')
            ->orderBy('m.date','DESC')

感觉有点愚蠢。

@BorisGuéry上面的查询在phpmyadmin上运行得很好,没有错误。但问题是我需要使用查询生成器来实现它。您尝试了什么?是什么错误让你认为它失败了?或者您正在寻找可以为您编写查询的人?选择m.id,m.subject,m.date FROM message m JOIN message_incoming mi ON m.id=mi.id JOIN message_outing mo ON m.id=mo.id其中m.recipient_id=1和mi.trash=1和mi.deleted=0或mo.trash=1和mo.deleted=0和mo.sent=1 ORDER by date DESC这是我试图避免联合的原因,但它返回null,这是不正确的,是的,我目前正在寻找可以加入查询(避免联合)或可以通过查询生成器实现联合的人。dude在查询生成器中处理变量时,应该使用参数。不要只是将字符串与变量连接起来
$queryBuilder = $this->entityManager->getRepository('EzxWebmailBundle:Message')
            ->createQueryBuilder('m')
            ->select('m.id','m.subject','m.date')
            ->join('m.message_outgoing','mo','ON','m.id = mo.id')
            ->join('m.message_incoming','mi','ON','m.id = mi.id')
            ->where('(m.recipient_id = '.$userId)
            ->andWhere('mi.trash = 1')
            ->andWhere('mi.deleted = 0)')
            ->orWhere('(m.originator_id = '.$userId)
            ->andWhere('mo.trash = 1')
            ->andWhere('mo.deleted = 0')
            ->andWhere('mo.sent = 1)')
            ->orderBy('m.date','DESC')