【发布时间】:2014-03-18 07:57:20
【问题描述】:
我正在使用 Symfony2 框架,但在 Doctrine 数据库查询方面遇到了一些问题:
我已经定义了两个实体“客户”和“模块”,并在两者之间建立了多对可能的关系。实际上,模块只有在为客户激活时才会存储到数据库中。
图像数据库如下所示:
Customer
|id|name|
100, foobar
200, foobar2
300, foobar3
Modul
|id|name|
1, modul1
2, modul2
3, modul3
4, modul4
(automatic generated m-to-n table)
Customer_Modul
|customer_id|modul_id|
100, 1
200, 2
200, 4
300, 4
现在我想查询特定客户及其模块。我需要一个左连接,因为模块只有在它们被激活时才会被存储。
我的查询代码如下所示:
$query = '
SELECT m.id, m.name, CASE WHEN c.id IS NULL THEN FALSE ELSE TRUE END as active
FROM MyNamespace:Modul m
LEFT JOIN m.customers c WITH c.id = :id
';
$queryObj = $this->doctrine->getManager()->createQuery($query);
$queryObj->setParameter('id', $id);
$modules = $queryObj->getResult();
我现在的问题如下:在内部这个本机查询是由教义提出的:
SELECT
m0_.id AS id0,
m0_.name AS name1,
CASE WHEN c1_.id IS NULL THEN 0 ELSE 1 END AS sclr2
FROM
modul m0_
LEFT JOIN customer_modul c2_ ON m0_.id = c2_.modul_id
LEFT JOIN customer c1_ ON c1_.id = c2_.customer_id
AND (c1_.id = ?)
但我真正需要的本机查询是这个:
SELECT
m0_.id AS id0,
m0_.name AS name1,
CASE WHEN c1_.id IS NULL THEN 0 ELSE 1 END AS sclr2
FROM
modul m0_
LEFT JOIN customer_modul c2_ ON m0_.id = c2_.modul_id
AND (c2_.customer_id = ?)
LEFT JOIN customer c1_ ON c1_.id = c2_.customer_id
除了使用本地教义查询之外,有人知道如何做到这一点吗?
已经感谢您的帮助,
苏萨
【问题讨论】:
标签: symfony doctrine-orm many-to-many left-join with-statement