使用Sonata Admin Bundle,这是Symfony的一个很好的附加组件,我遇到了如下所述的问题。
我们说我们有3个实体:城市,州和国家。它们都具有id
和name
属性。城市与州和州之间具有多对一的关系,与国家有着多对一的关系。他们都必须使用字符串方法显示属性名称的值。
我们可以在Sonata Admin中为实体City创建一个列表视图,如下所示:
protected function configureListFields(ListMapper $ listMapper) { $ listMapper - > addIdentifier(' ID') - >添加('名称') - >添加('状态') - >添加(' state.country') ; }
为了说明,视图可能如下所示:
|-----||--------------------||--------------------||--------------------|
| Id ^|| Name ^ || State || State Country |
|-----||--------------------||--------------------||--------------------|
| 1 || New York || New York || USA |
| 2 || Acapulco || Guerrero || Mexico |
| 3 || Calgary || Alberta || Canada |
| 4 || Tijuana || Baja California || Mexico |
| 5 || Vancouver || British Columbia || Canada |
| 6 || Los Angeles || California || USA |
|-----||--------------------||--------------------||--------------------|
默认情况下,列表可按 ID 和名称列进行排序,符号^应描述该列。我希望能够按相关实体字段对列表进行排序,并有一个指向相关实体的show动作的链接。
以下是我通过 State :
实现排序的方法//...
->add('state', null, array(
'route' => array('name' => 'show'),
'sortable' => true,
'sort_field_mapping' => array('fieldName' => 'name'), // property name of entity State
'sort_parent_association_mappings' => array(array('fieldName' => 'state')) // property state of entity City
))
//...
现在,列表视图可以按实体状态的属性名称进行排序,并且列状态中的所有字段都指向显示页面对于当前状态:
|-----||--------------------||--------------------||--------------------|
| Id ^|| Name ^ || State ^ || State Country |
|-----||--------------------||--------------------||--------------------|
| 3 || Calgary || Alberta || Canada |
| 4 || Tijuana || Baja California || Mexico |
| 5 || Vancouver || British Columbia || Canada |
| 6 || Los Angeles || California || USA |
| 2 || Acapulco || Guerrero || Mexico |
| 1 || New York || New York || USA |
|-----||--------------------||--------------------||--------------------|
如何按国家/地区(City-> State-> Country)对列表视图进行排序?像这样:
|-----||--------------------||--------------------||--------------------|
| Id ^|| Name ^ || State ^ || State Country |
|-----||--------------------||--------------------||--------------------|
| 3 || Calgary || Alberta || Canada |
| 5 || Vancouver || British Columbia || Canada |
| 2 || Acapulco || Guerrero || Mexico |
| 4 || Tijuana || Baja California || Mexico |
| 6 || Los Angeles || California || USA |
| 1 || New York || New York || USA |
|-----||--------------------||--------------------||--------------------|
当我尝试类似上面的代码片段时:
//...
->add('state.country', null, array(
'route' => array('name' => 'show'),
'sortable' => true,
'sort_field_mapping' => array('fieldName' => 'country.name'), // property name of entity Country
'sort_parent_association_mappings' => array(array('fieldName' => 'state.country')) // property country of entity State
))
//...
然后抛出异常错误。我尝试了不同的组合,但都没有成功。
我能做到:
protected function configureListFields(ListMapper $listMapper)
{
$listMapper
->addIdentifier('id')
->add('name')
->add('state.name')
->add('state.country.name')
;
}
并解决了排序问题,但之后没有实体链接。
官方文档非常好,但缺少此主题。那么,如何按层次结构实体对列表视图进行排序呢?
答案 0 :(得分:11)
在发布问题后的第二天,我正在挖掘SonataAdminBundle和Symfony的源代码,并找到了解决方案。这实际上很容易。在这里:
//...
->add(
'state.country',
null,
array(
'associated_property' => 'name', // property name of entity Country
'sortable' => true, // IMPORTANT! make the column sortable
'sort_field_mapping' => array(
'fieldName' => 'name' // property name of entity Country
),
'sort_parent_association_mappings' => array(
array('fieldName' => 'state') // property state of entity City
array('fieldName' => 'country') // property country of entity State
)
)
)
//...
使用associated_property
我们设置应显示的属性。如果我们在实体中定义了__toString
方法,则可以省略这一点。在这种情况下,它意味着国家的名称将显示在列中。
选项sort_field_mapping
需要一个包含键fieldName
的数组,其中包含我们要排序的属性。在这里,我们按国家名称排序。然而,我们可以按人口排序,假设我们在实体Country中有该属性,尽管我们显示的是该名称的值。
sort_parent_association_mappings
是最有趣的部分。在这里,我们定义应该创建连接查询的属性:City具有属性状态,即实体State,其本身具有属性Country作为实体Country。
我希望我的解释是可以理解的,也可以帮助其他人。