Orm 内/左连接两个表

Orm 内/左连接两个表,orm,doctrine-orm,doctrine,doctrine-1.2,doctrine-query,Orm,Doctrine Orm,Doctrine,Doctrine 1.2,Doctrine Query,下面是我的问题。我在上一个问题上也在寻求帮助。。感谢那些帮助我解决问题的人 我在条令2.3中创建了一个大问题,操作对我来说并不熟悉。但我在许多人的帮助下学会了。目前我面临的问题是三个表之间的内部连接 我的关节: SELECT * FROM user AS u LEFT JOIN source AS s ON u.user_source_fk=s.source_id LEFT JOIN area AS a ON s.source_node_fk = a.area_id; 上面的问题是我试图在教义

下面是我的问题。我在上一个问题上也在寻求帮助。。感谢那些帮助我解决问题的人

我在条令2.3中创建了一个大问题,操作对我来说并不熟悉。但我在许多人的帮助下学会了。目前我面临的问题是三个表之间的内部连接

我的关节:

SELECT *
FROM user AS u
LEFT JOIN source AS s ON u.user_source_fk=s.source_id
LEFT JOIN area AS a ON s.source_node_fk = a.area_id;
上面的问题是我试图在教义中转换的

我试图这样给出查询,但它不起作用:

SELECT a FROM Ipf\Model\User u LEFT JOIN Ipf\Model\Sources ON u.user_source_fk=s.source_id LEFT JOIN Ipf\Model\Area aa ON s.source_node_fk = aa.area_id;
我的原始查询将如何:

1.加入查询: +

我想使用上面的查询对查询进行内部联接,该查询是带有运算符的内部联接

如何联接表并执行查询

2.查询生成: 如何通过JOIN操作修改以实现上述查询


有人能帮我解决我的问题吗。对我来说,这是一场噩梦

查询的复杂部分实际上是
的WHERE
,因此您应该能够轻松添加连接

$qry = $this->manager()->createQueryBuilder()
        ->select(array('e', 's', 'a'))
        ->from($this->entity, 'e')
        ->leftJoin('e.sources', 's')
        ->leftJoin('s.node', 'a');
然后,您将按原样执行其余的查询逻辑

需要提到的一点是,在DQL中,您处理的是实体及其属性,而不是表和列


因此,在我的示例中,
e.sources
需要是
UserSource
实体/集合在
User
实体上的映射属性名。类似地,
s.node
需要是
UserSource
上的
区域
实体/集合的映射属性名,这也意味着我需要在XML映射中连接两个表,或者我可以创建查询并运行?我看到可能在一对一、一对多、多对多、双向的原则中存在连接?有什么我想改变的吗?我不知道你没有发布你的模型。。。这对评估它是必要的。但是通常是的,如果您使用的是ORM,那么您应该定义适当的映射。如果您只是在使用DBAL,那么情况就不同了。我正在研究由Zend/Doctrine专家创建的任何现有应用程序。。他们使用了很多让我困惑的功能。。但是直到现在我还没有遇到任何DBAL。。我的模块供您参考,XML映射仍然是我面临的问题,也是上面的查询应该找到在同一查询中找到的具有限制的结果数
SELECT * FROM user WHERE 
(`user_name` like '%TOM%' OR `user_name` like '%AN%' and `login_datetime` BETWEEN '2013-01-01 00:00:00' and '2013-02-31 23:59:59') OR
NOT ( --NOR
   (`user_name` like '%PHP%' OR `user_name` like '%BA%' and `login_datetime` BETWEEN '2013-02-01 00:00:00' and '2013-03-31 23:59:59') OR
   (`user_name` like '%SUN%' OR `user_name` like '%MOON%' and `login_datetime` BETWEEN '2013-03-01 00:00:00' and '2013-04-31 23:59:59')
) OR
NOT ( --NAND
   (`user_name` like '%RAJ%' OR `user_name` like '%MUTH%' and `login_datetime` BETWEEN '2013-04-01 00:00:00' and '2013-06-31 23:59:59') AND
   (`user_name` like '%BAG%' OR `user_name` like '%LAP%' and `login_datetime` BETWEEN '2013-05-01 00:00:00' and '2013-07-31 23:59:59')
)
$qry = $this->manager()->createQueryBuilder()
        ->from($this->entity, 'e')
        ->select('e');


// (`user_name` like '%TOM%' OR `user_name` like '%AN%' and `login_datetime` BETWEEN '2013-01-01 00:00:00' and '2013-02-31 23:59:59')
$expr1 = $qry->expr()->andX(
    $qry->expr()->orX(
       $qry->expr()->like('e.user_name', '%TOM%'), 
       $qry->expr()->like('e.user_name', '%AN%')
    ),
    $qry->expr()->between('e.login_datetime', '2013-02-01 00:00:00', '2013-02-31 23:59:59')
);

//(`user_name` like '%PHP%' OR `user_name` like '%BA%' and `login_datetime` BETWEEN '2013-02-01 00:00:00' and '2013-03-31 23:59:59')

$expr2a = $qry->expr()->andX(
    $qry->expr()->orX(
       $qry->expr()->like('e.user_name', '%PHP%'), 
       $qry->expr()->like('e.user_name', '%BA%')
    ),
    $qry->expr()->between('e.login_datetime', ''2013-02-01 00:00:00'', '2013-03-31 23:59:59')
);

// (`user_name` like '%SUN%' OR `user_name` like '%MOON%' and `login_datetime` BETWEEN '2013-03-01 00:00:00' and '2013-04-31 23:59:59')
$expr2b = $qry->expr()->andX(
    $qry->expr()->orX(
       $qry->expr()->like('e.user_name', '%SUN%'), 
       $qry->expr()->like('e.user_name', '%MOON%')
    ),
    $qry->expr()->between('e.login_datetime', '2013-03-01 00:00:00', '2013-04-31 23:59:59')
);

// combine expr2a and expr2b with OR as $expr2

$expr2 = $qry->expr()->orX($expr2a, $expr2b);


// (`user_name` like '%RAJ%' OR `user_name` like '%MUTH%' and `login_datetime` BETWEEN '2013-04-01 00:00:00' and '2013-06-31 23:59:59')

$expr3a = $qry->expr()->andX(
    $qry->expr()->orX(
       $qry->expr()->like('e.user_name', '%RAJ%'), 
       $qry->expr()->like('e.user_name', '%MUTH%')
    ),
    $qry->expr()->between('e.login_datetime', ''2013-04-01 00:00:00'', '2013-06-31 23:59:59')
);

// (`user_name` like '%BAG%' OR `user_name` like '%LAP%' and `login_datetime` BETWEEN '2013-05-01 00:00:00' and '2013-07-31 23:59:59')
$expr3b = $qry->expr()->andX(
    $qry->expr()->orX(
       $qry->expr()->like('e.user_name', '%BAG%'), 
       $qry->expr()->like('e.user_name', '%LAP%')
    ),
    $qry->expr()->between('e.login_datetime', '2013-05-01 00:00:00', '2013-07-31 23:59:59')
);

// combine expr2a and expr2b with OR as $expr2

$expr3 = $qry->expr()->andX($expr3a, $expr3b);


// final query essentially WHERE expr1 OR NOT(expr2) OR NOT(expr3)
$qry->where($expr1)
    ->or($qry->expr()->not($expr2))
    ->or($qry->expr()->not($expr3));
$qry = $this->manager()->createQueryBuilder()
        ->select(array('e', 's', 'a'))
        ->from($this->entity, 'e')
        ->leftJoin('e.sources', 's')
        ->leftJoin('s.node', 'a');