Php 通过关联过滤实体

Php 通过关联过滤实体,php,doctrine-orm,doctrine,Php,Doctrine Orm,Doctrine,我有一个名为公司的实体。关联映射如下所示: manyToOne: headCompany: targetEntity: CompanyEntity inversedBy: headCompany oneToMany: subsidiaries: targetEntity: CompanyEntity mappedBy: headCompany +----+--------------+ | id | subsidi

我有一个名为
公司
的实体。关联映射如下所示:

manyToOne:
    headCompany:
        targetEntity: CompanyEntity
        inversedBy: headCompany
oneToMany:
    subsidiaries:
        targetEntity: CompanyEntity
        mappedBy: headCompany
+----+--------------+
| id | subsidiaries |
+----+--------------+
| 1  | 3            |
+----+--------------+
| 5  | 2            |
+----+--------------+
$query = $qb->select('e')
    ->from('CompanyEntity', 'e')
    ->join('e.headCompany', 'h')
    ->addSelect("(CASE WHEN COUNT(h.id) > 0 THEN 1 ELSE 0 END) as sort_sub")
    ->groupBy("e.id")
    ->orderBy("sort_sub");
一切正常。一家公司可以是另一家公司的子公司和/或拥有自己的子公司

现在,我需要筛选其他公司的总公司或拥有子公司的公司。

我可以直接用SQL实现这一点:

SELECT c.id, COUNT(s.headCompany_id) subsidiaries FROM companies c LEFT JOIN companies s ON s.headCompany_id = c.id GROUP BY c.id HAVING subsidiaries > 0
结果如下:

manyToOne:
    headCompany:
        targetEntity: CompanyEntity
        inversedBy: headCompany
oneToMany:
    subsidiaries:
        targetEntity: CompanyEntity
        mappedBy: headCompany
+----+--------------+
| id | subsidiaries |
+----+--------------+
| 1  | 3            |
+----+--------------+
| 5  | 2            |
+----+--------------+
$query = $qb->select('e')
    ->from('CompanyEntity', 'e')
    ->join('e.headCompany', 'h')
    ->addSelect("(CASE WHEN COUNT(h.id) > 0 THEN 1 ELSE 0 END) as sort_sub")
    ->groupBy("e.id")
    ->orderBy("sort_sub");
然后,公司1和5将符合我的筛选条件,因为它们都有子公司

如何使用条令查询生成器获得相同的结果?

我的尝试是:

$query = $qb->select('e')
    ->from('CompanyEntity', 'e')
    ->orderBy('e.id', 'ASC')
    ->join('e.headCompany', 'h')
    ->addSelect("COUNT(h.id) as subsidiaries")
    ->groupBy("e.id")
    ->having("subsidiaries > 0");
这一个返回子公司,而不是总公司

->其中($qb->expr()->isNotNull(“e.subsiders”))


这显然是教义所不允许的

如何取消加入条款,选择公司并加入子公司,然后根据与每个公司相关的子公司数量应用过滤器

$query = $qb->select('h,s')
    ->from('CompanyEntity', 'h')
    ->join('h.subsidiaries', 's')
    ->addSelect("COUNT(s.id) AS HIDDEN subsidiaries")
    ->groupBy("h.id")
    ->orderBy('h.id', 'ASC')
    ->having("subsidiaries > 0");
当您使用时,您无法选择实体的所有列,除非它们出现在group by中,因此必须在
select()
中选择要返回的列

根据官方文件“仅通过拒绝查询(select list、HAVING CONDICTION或ORDER BY list针对这些查询引用的非聚合列,这些列既不在GROUP BY子句中命名,也不在功能上依赖于GROUP BY列(由GROUP BY列唯一确定)。”


如何取消加入条款,选择公司并加入子公司,然后根据与每个公司相关的子公司数量应用过滤器

$query = $qb->select('h,s')
    ->from('CompanyEntity', 'h')
    ->join('h.subsidiaries', 's')
    ->addSelect("COUNT(s.id) AS HIDDEN subsidiaries")
    ->groupBy("h.id")
    ->orderBy('h.id', 'ASC')
    ->having("subsidiaries > 0");
当您使用时,您无法选择实体的所有列,除非它们出现在group by中,因此必须在
select()
中选择要返回的列

根据官方文件“仅通过拒绝查询(select list、HAVING CONDICTION或ORDER BY list针对这些查询引用的非聚合列,这些列既不在GROUP BY子句中命名,也不在功能上依赖于GROUP BY列(由GROUP BY列唯一确定)。”


您应该能够按案例使用订单,有点像这样:

manyToOne:
    headCompany:
        targetEntity: CompanyEntity
        inversedBy: headCompany
oneToMany:
    subsidiaries:
        targetEntity: CompanyEntity
        mappedBy: headCompany
+----+--------------+
| id | subsidiaries |
+----+--------------+
| 1  | 3            |
+----+--------------+
| 5  | 2            |
+----+--------------+
$query = $qb->select('e')
    ->from('CompanyEntity', 'e')
    ->join('e.headCompany', 'h')
    ->addSelect("(CASE WHEN COUNT(h.id) > 0 THEN 1 ELSE 0 END) as sort_sub")
    ->groupBy("e.id")
    ->orderBy("sort_sub");

您可以在本帖中了解更多信息:

您应该能够按案例使用订单,有点像这样:

manyToOne:
    headCompany:
        targetEntity: CompanyEntity
        inversedBy: headCompany
oneToMany:
    subsidiaries:
        targetEntity: CompanyEntity
        mappedBy: headCompany
+----+--------------+
| id | subsidiaries |
+----+--------------+
| 1  | 3            |
+----+--------------+
| 5  | 2            |
+----+--------------+
$query = $qb->select('e')
    ->from('CompanyEntity', 'e')
    ->join('e.headCompany', 'h')
    ->addSelect("(CASE WHEN COUNT(h.id) > 0 THEN 1 ELSE 0 END) as sort_sub")
    ->groupBy("e.id")
    ->orderBy("sort_sub");

您可以在此线程中了解更多信息:

谢谢您的时间,但它不起作用:
SQLSTATE[42000]:语法错误或访问冲突:选择列表的1055表达式#12不在GROUP BY子句中,并且包含未聚合的列“table.c1.id”,它在功能上不依赖GROUP BY子句中的列;这与sql\u mode=only\u full\u group\u by
不兼容。在这种情况下加入子公司是否正确?这不是一个实际的专栏,只是一个条令关联。同样的问题:-(
SQLSTATE[42000]:语法错误或访问冲突:SELECT列表的1055表达式#12不在GROUP BY子句中,并且包含未聚合的列“table_dev.c0_.id”,该列在功能上不依赖GROUP BY子句中的列;这与sql_mode=only_full_GROUP BY
@Vinícius不兼容。由于您只使用了_full_GROUP BY,我已更新了我的答案mode您上次的更新工作得非常完美!非常感谢!旁注:我已将
$query=$qb->select('h.id')
更改为
$query=$qb->select('h')
,以使条令填充所有实体字段。感谢您的时间,但它没有工作:
SQLSTATE[42000]:语法错误或访问冲突:1055 SELECT list的表达式#12不在GROUP BY子句中,并且包含未聚合的列“table.c1 uu.id”,该列在功能上不依赖GROUP BY子句中的列;这与sql_mode=only_full_GROUP BY
不兼容。在此上下文中联接
子公司
正确吗?不正确一个实际的列,只是一个条令关联。同样的问题:-(
SQLSTATE[42000]:语法错误或访问冲突:SELECT列表的1055表达式#12不在GROUP BY子句中,并且包含未聚合的列“table_dev.c0_.id”,该列在功能上不依赖GROUP BY子句中的列;这与sql_mode=only_full_GROUP BY
@Vinícius不兼容。由于您只使用了_full_GROUP BY,我已更新了我的答案mode您上次的更新工作得非常完美!非常感谢!旁注:我已将
$query=$qb->select('h.id')
更改为
$query=$qb->select('h')
,以使条令填充所有实体字段。删除
->orderBy(“sort\u sub”)
如果出现错误,此方法将返回作为子公司的公司,而不是有子公司的公司,不幸的是,就像我第一次尝试一样。感谢您的时间。删除
->orderBy(“sort_sub”)
这是一个错误,这个方法返回的是子公司的公司,而不是有子公司的公司,很遗憾,就像我第一次尝试一样。谢谢您的时间。