【问题标题】:doctrine2 (symfony2) many-to-many with "WITH" and null values教义2(symfony2)多对多,带有“WITH”和空值
【发布时间】: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


    【解决方案1】:

    你可以试试

    SELECT m.id, m.name, 
        (SELECT c.id FROM YourNamespace:Customers c JOIN c.modules m2 
         WHERE m2.id = m.id and c.id = :customerId) AS checked
    FROM YourNamespace:Modul m
    

    【讨论】:

    • 似乎是一个小技巧,但对我有用。谢谢!
    猜你喜欢
    • 2013-08-04
    • 2014-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-23
    相关资源
    最近更新 更多