我希望在一个实体中订购一个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
这可能还是我只是要求太多?
答案 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