为ManyToOne关系实现自定义OrderBy

问题描述 投票:0回答:1

不幸的是,

ManyToOne
关系不支持OrderBy属性。 有没有办法实现自定义的?类似于属性方法?

我已经尝试过 SQLFilter 但事实证明,它不适用于 ORDER BY 语句。

我也在使用API平台。

编辑: 在 Companies.applications 上实现 OrderBy

#[ORM\OrderBy(['candidate.firstName' => 'DESC'])]
#[Groups(['opening:read'])]
#[ORM\OneToMany(mappedBy: 'job', targetEntity: Application::class)]
private Collection $applications;

应用程序实体具有此属性

#[ORM\ManyToOne(inversedBy: 'applications')]
#[ORM\JoinColumn(nullable: false)]
private ?User $candidate = null;

返回错误

Warning: Undefined array key \"candidate.firstName\"
并基于这个学说文档

引用的字段名称必须存在于 #[ManyToMany] 或 #[OneToMany] 属性的 targetEntity 类中。

symfony doctrine-orm doctrine
1个回答
0
投票

正如您自己指出的那样,教义文档非常清楚,这是不可能做到的。也许有一些花哨的 AST Walkers,但我不推荐这样做。

OrderBy 中的 DQL 片段仅允许包含不合格、不带引号的字段名称和可选的 ASC/DESC 位置语句。多个字段之间用逗号 (,) 分隔。引用的字段名称必须存在于 #[ManyToMany] 或 #[OneToMany] 属性的 targetEntity 类中。

您可以稍微反规范化您的应用程序实体,并在该特定实体上添加

$firstName
属性,该属性在创建/更新实体时从
User
实体复制该值。

然后您可以将您的

Company
实体重写为:

#[ORM\OrderBy(['firstName' => 'DESC'])]
#[Groups(['opening:read'])]
#[ORM\OneToMany(mappedBy: 'job', targetEntity: Application::class)]
private Collection $applications;

但是,非规范化步骤确实是一种偏好,并且对于某些人来说可能也不是更好的方法。

© www.soinside.com 2019 - 2024. All rights reserved.