doctrine按实体排序到多个关联

时间:2014-06-18 15:32:17

标签: php doctrine-orm

我希望在一个实体中订购一个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

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

2 个答案:

答案 0 :(得分:5)

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

  

OrderBy中的DQL Snippet只允许包含不合格的,   不带引号的字段名称和可选的ASC / DESC位置语句。   多个字段用逗号(,)分隔。引用的字段   名称必须存在于@ManyToMany的targetEntity类或   @OneToMany注释

在您的情况下,目标实体(extension)上不存在file。相反,它存在于实体mime_type上,因此它的层次太深。我不认为可以使用@OrderBy按多个级别的字段进行排序。

您可以考虑将extension字段(或所有mime_type字段)移至file。并使用

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

答案 1 :(得分:3)

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

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