Orm 内/左连接两个表
下面是我的问题。我在上一个问题上也在寻求帮助。。感谢那些帮助我解决问题的人 我在条令2.3中创建了一个大问题,操作对我来说并不熟悉。但我在许多人的帮助下学会了。目前我面临的问题是三个表之间的内部连接 我的关节: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; 上面的问题是我试图在教义
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');