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