【问题标题】:Symfony Return child objects depend of some propertySymfony 返回子对象依赖于某些属性
【发布时间】:2018-07-20 13:43:02
【问题描述】:

我正在使用 Symfony 4 + Api 平台。我有一个实体(保险),它与另一个实体(MediaObject)相关。当我尝试获取某个保险项目时,它会返回与其相关的所有 MediaObjects 项目。但是,我不想返回所有的 MediaObjects。我需要 DeleteAt 为 null 的 MediaObjects。

我该如何解决这个问题?

我有一个我编码的 DoctrineExtension:

$queryBuilder->join(sprintf('%s.mediaObjects', $rootAlias), 'mo');
$queryBuilder->andWhere(sprintf('%s.deletedAt IS NULL', $rootAlias));
$queryBuilder->andWhere('mo.deletedAt IS NULL');

但什么也没发生。它仍在返回所有项目。

[
  {
    "id": 1,
    "mediaObjects": [
      {
        "id": 5,
        "mimetype": "image/jpeg",
        "type": "INSURANCE",
        "createdAt": "2018-07-20T09:36:05+02:00",
        "updatedAt": "2018-07-20T09:36:05+02:00",
        "deletedAt": "2018-07-20T14:20:34+02:00"
      },
      {
        "id": 10,
        "mimetype": "image/jpeg",
        "type": "INSURANCE",
        "createdAt": "2018-07-20T11:01:38+02:00",
        "updatedAt": "2018-07-20T14:04:42+02:00",
        "deletedAt": "2018-07-20T14:20:34+02:00"
      },
      {
        "id": 4,
        "mimetype": "image/jpeg",
        "type": "INSURANCE",
        "createdAt": "2018-07-20T09:35:56+02:00",
        "updatedAt": "2018-07-20T14:04:00+02:00",
        "deletedAt": "2018-07-20T14:15:09+02:00"
      },
      {
        "id": 6,
        "mimetype": "image/jpeg",
        "type": "INSURANCE",
        "createdAt": "2018-07-20T09:36:13+02:00",
        "updatedAt": "2018-07-20T14:15:49+02:00",
        "deletedAt": null
      }
    ],
    "expirationDate": "2018-07-19T08:25:29+02:00",
    "policy": "Verduras",
    "producerName": "Aseguradoras S.L.",
    "contactEmail": "testsingfact+aseguradora1@gmail.com",
    "contactPhone": "700000001",
    "quantity": 1200,
    "type": "CARGO",
    "coverageExceptions": "Caidas",
    "createdAt": "2018-07-19T10:27:22+02:00",
    "updatedAt": "2018-07-19T13:06:31+02:00",
    "deletedAt": null
  }
]

【问题讨论】:

  • 您可以在问题中添加完整的查询代码而不是那 3 行吗?此外,如果您将$queryBuilder->getDQL() 的结果添加到问题中,这将非常有用。
  • 我无法访问查询,我的意思是,查询在 Api Platform 核心上。我想我可以添加一些句子来使用 DoctrineExtesion (api-platform.com/docs/core/extensions) 重新定义该查询,这就是那些行。不管怎样,我明天打印 $queryBuilder->getDQL() 并粘贴到这里。
  • 好的。等待你的 DQL
  • 我终于用你的命令得到了 dql,句子是“SELECT o, mediaObjects_a1 FROM App\Entity\App\Insurance o LEFT JOIN o.mediaObjects mediaObjects_a1 WHERE o.corporate = :corporate AND o. deletedAt IS NULL ORDER BY o.id ASC”。基于此,我添加了 $queryBuilder->andWhere('mediaObjects_a1.deletedAt IS NULL');这正在工作^^。谢谢。无论如何,我不知道这是否是最好的方法,因为我不知道别名“mediaObjects_a1”是否始终相同。

标签: symfony symfony4 api-platform.com


【解决方案1】:

您应该使用条件连接并将过滤器应用于连接集合而不是整个集合:

$queryBuilder->join(sprintf('%s.mediaObjects', $rootAlias), 'mo', 'WITH', 'mo.deletedAt IS NULL');
$queryBuilder->andWhere(sprintf('%s.deletedAt IS NULL', $rootAlias));

请记住,由于join,此查询不会返回没有未删除媒体对象的保险实体。如果您希望它还返回具有空媒体集合的对象,请将 join 更改为 leftJoin

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-02
    • 2021-07-07
    • 1970-01-01
    • 1970-01-01
    • 2021-04-02
    相关资源
    最近更新 更多