Php 按实体对许多协会排序的原则

Php 按实体对许多协会排序的原则,php,doctrine-orm,Php,Doctrine Orm,我希望在一个实体中订购一个OneToMany关联,但有一点需要注意,我想要订购的特定属性不在该实体中,而是它所关联的某个对象的属性 很抱歉开始时让人困惑,让我们尝试用一个例子来澄清情况。我希望能够做一些类似于: class download { /** * @ORM\OneToMany(targetEntity="entity\download\file", mappedBy="download", indexBy="id") * @ORM\JoinColumn(na

我希望在一个实体中订购一个OneToMany关联,但有一点需要注意,我想要订购的特定属性不在该实体中,而是它所关联的某个对象的属性

很抱歉开始时让人困惑,让我们尝试用一个例子来澄清情况。我希望能够做一些类似于:

class download
{
    /**
     * @ORM\OneToMany(targetEntity="entity\download\file", mappedBy="download", indexBy="id")
     * @ORM\JoinColumn(name="download_id", referencedColumnName="download_id")
     * @ORM\OrderBy({"mime_type.extension" = "ASC"})
     */
    protected $files = null;
}
其中一个
下载
有许多
文件
,每个
文件
有一个
mime\u类型

目前,我的结果是
或异常:无法识别的字段:mime\u type

这是可能的还是我要求的太多了?

OrderBy中的DQL代码段仅允许由以下内容组成:, 未加引号的字段名和可选ASC/DESC位置语句的名称。 多个字段用逗号(,)分隔。引用字段 名称必须存在于@ManyToMany或的targetEntity类中 @OneToMany注释

在您的情况下,
扩展名
在目标实体(即
文件
)上不存在。相反,它存在于实体
mime\u type
上,因此它的级别太深了。我认为不可能使用
@OrderBy
对一个字段进行多级排序

您可以考虑将<代码>扩展> /代码>字段(或真正的所有代码> MIMEYTYPE类型字段)移动到<代码>文件< /代码>中。和使用

 * @ORM\OrderBy({"extension" = "ASC"})

如果无法更改数据库结构,另一种解决方案也很有用:可以在存储库中应用OrderBy子句,编写完整的DQL查询,在其中连接所有3个表:

SELECT d
FROM download AS d
LEFT JOIN files AS f
LEFT JOIN mime_type AS m
ORDER BY m.extension

这正是我所期望的,但我真的不想看到;)也许有一天::)