symfony 为ManyToOne关系实现自定义OrderBy

j5fpnvbx  于 2023-10-23  发布在  其他
关注(0)|答案(1)|浏览(117)

不幸的是,ManyToOne关系不支持OrderBy属性。有没有一种方法可以实现自定义属性?类似于Attributes方法?
我已经尝试过SQLFilter,但事实证明,它不适用于ORDER BY语句。
我也在使用API平台。
编辑:在Companies.应用程序上实现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类中。

1zmg4dgp

1zmg4dgp1#

doctrine docs很清楚,正如你自己所指出的,这是不可能做到的。也许用一些花哨的AST沃克,但我不建议这样做。
OrderBy中的DQL嗅探器只允许由非限定的、未加引号的字段名称和可选的ASC/DESC位置语句组成。多个字段由逗号(,)分隔。引用的字段名称必须存在于#[ManyToMany]或#[OneToMany]属性的targetEntity类中。
您可以稍微反规范化您的Application实体,并在该特定实体上添加$firstName属性,该属性在创建/更新实体时从User实体复制该值。
然后,您可以将Company实体重写为:

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

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

相关问题