按相关实体字段对Sonata Admin中的列表视图排序

cez*_*zar 7 doctrine symfony sonata-admin

使用Sonata Admin Bundle,它是Symfony的一个很好的附加组件,我遇到了如下所述的问题.

假设我们有3个实体:城市,州和国家.他们都有属性idname.城市与州和州之间具有多对一的关系,与国家有着多对一的关系.它们都必须使用字符串方法显示属性名称的值.

我们可以在Sonata Admin中为实体City创建一个列表视图,如下所示:

protected function configureListFields(ListMapper $ listMapper){$ listMapper - > addIdentifier('id') - > add('name') - > add('state') - > add('state.country'); }

为了说明,视图可能如下所示:

protected function configureListFields(ListMapper $listMapper)
{
    $listMapper
        ->addIdentifier('id')
        ->add('name')
        ->add('state')
        ->add('state.country')
    ;
}
Run Code Online (Sandbox Code Playgroud)

默认情况下,列表可以按列Id名称进行排序,符号^应该描述该列表.我希望能够通过相关实体字段对列表进行排序,并具有指向相关实体的show动作的链接.

以下是我通过State实现排序的方法:

|-----||--------------------||--------------------||--------------------|
| 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                |
|-----||--------------------||--------------------||--------------------|
Run Code Online (Sandbox Code Playgroud)

现在列表视图可以按实体State的属性进行排序,列State中的所有字段都指向当前状态的show页面:

//...
->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
))
//...
Run Code Online (Sandbox Code Playgroud)

如何按国家/地区(城市 - >州 - >国家/地区)对列表视图进行排序?像这样的东西:

|-----||--------------------||--------------------||--------------------|
| 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                |
|-----||--------------------||--------------------||--------------------|
Run Code Online (Sandbox Code Playgroud)

当我尝试类似上面的代码片段时:

|-----||--------------------||--------------------||--------------------|
| 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                |
|-----||--------------------||--------------------||--------------------|
Run Code Online (Sandbox Code Playgroud)

然后抛出异常错误.我尝试了不同的组合,但都没有成功.

我可以:

//...
->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
))
//...
Run Code Online (Sandbox Code Playgroud)

并解决了排序问题,但没有实体链接.

官方文档非常好,但缺少这个主题.那么,如何按层次结构实体对列表视图进行排序?

cez*_*zar 14

在发布问题后的第二天,我正在挖掘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
        )
    )
)
//...
Run Code Online (Sandbox Code Playgroud)

随着associated_property我们设定将要显示的属性.如果我们__toString在实体中定义了一个方法,则可以省略这一点.在这种情况下,它表示该国家/地区的名称将显示在列中.

该选项sort_field_mapping需要一个数组,其中的键fieldName包含我们要排序的属性.在这里,我们按国家名称排序.然而,我们可以按人口排序,假设我们在实体Country中有该属性,尽管我们正在显示该名称的值.

sort_parent_association_mappings是最有趣的部分.在这里,我们定义应该创建连接查询的属性:City具有属性状态,即实体State,其本身具有属性Country作为实体Country.

我希望我的解释是可以理解的,也可以帮助其他人.