不幸的是,
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 类中。
正如您自己指出的那样,教义文档非常清楚,这是不可能做到的。也许有一些花哨的 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;
但是,非规范化步骤确实是一种偏好,并且对于某些人来说可能也不是更好的方法。