使用 Sonata Admin Bundle(这是 Symfony 的一个很棒的附加组件)时,我遇到了如下所述的问题。
假设我们有 3 个实体:城市、州和国家。他们都有属性id
and name
。城市与州之间存在多对一的关系,州与国家之间存在多对一的关系。他们都有__toString
显示属性名称值的方法。
我们可以在 Sonata Admin 中为实体 City 创建一个列表视图,如下所示:
protected function configureListFields(ListMapper $listMapper)
{
$listMapper
->addIdentifier('id')
->add('name')
->add('state')
->add('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 and Name,符号 ^ 应该描述这一点。我希望能够按相关实体字段对列表进行排序,并有一个指向相关实体的显示操作的链接。
这是我如何实现排序的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
))
//...
现在列表视图可以按属性排序name实体的State以及该列中的所有字段State指向当前状态的显示页面:
|-----||--------------------||--------------------||--------------------|
| 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 |
|-----||--------------------||--------------------||--------------------|
如何按以下方式对列表视图进行排序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')
;
}
并解决了排序问题,但是没有指向实体的链接。
官方文档很好,但是缺少这个主题。那么,如何按层次实体对列表视图进行排序呢?