按实体划分的许多协会


doctrine ordering toMany associations by entity

我想在一个实体中订购一个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;
}

一个download有多个files,每个file有一个mime_type

目前我以ORMException: Unrecognized field: mime_type

结束

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

http://doctrine-orm.readthedocs.org/en/latest/reference/annotations-reference.html#annref-orderby

OrderBy中的DQL片段只允许包含非限定的,未加引号的字段名和可选的ASC/DESC位置语句。多个字段之间用","分隔。引用字段名称必须存在于@ manymany或的targetEntity类中@OneToMany注释 .

在您的例子中,extension在目标实体(即file)上不存在。相反,它存在于实体mime_type上,所以它太深了。我认为不可能使用@OrderBy按多个层次的字段排序。

您可以考虑将extension字段(或者实际上所有mime_type字段)移动到file中。和使用

 * @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