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

2023-11-23

使用 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')
    ;
}

并解决了排序问题,但是没有指向实体的链接。

官方文档很好,但是缺少这个主题。那么,如何按层次实体对列表视图进行排序呢?


发布问题后的第二天,我深入研究了 Sonata Admin Bundle 和 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
        )
    )
)
//...

With associated_property我们设置应该显示的属性。如果我们定义了一个__toString实体中的方法。在这种情况下,这意味着该国家/地区的名称将显示在该列中。

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

And sort_parent_association_mappings是最有趣的部分。这里我们定义了创建连接查询所依据的属性: City 有一个属性 state,它是实体 State,它本身有一个属性 Country,即实体 Country。

我希望我的解释是可以理解的并且也可以帮助其他人。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • 如何在 Doctrine 中使用 andWhere 和 orWhere ?

    WHERE a 1 AND b 1 Or b 2 AND c 1 OR c 2 我怎样才能在教义中做到这一点 q gt where a 1 q gt andWhere b 1 q gt orWhere b 2 q gt andWhere c
  • Twig:如何获取字符串中的第一个字符

    我正在实施按字母顺序搜索 我们显示一个名称表 我只想突出显示那些名称以相应字母开头的字母 我被一个简单的问题难住了 如何读取 twig 中字符串 user name 的第一个字符 我尝试了多种策略 包括 0 操作 但它抛出异常 这是代码 f
  • Symfony 3新建项目报错

    我开始编写有关 Symfony 3 的教程 在使用以下命令创建新项目时遇到问题 php symfony phar new Symfony 我有这个错误 GuzzleHttp Exception RequestException Error
  • symfony2 FOSRestBundle 注释

    有人在控制器中使用过 put get post delete 注释 https github com FriendsOfSymfony FOSRestBundle blob master Controller Annotations 吗 我
  • Symfony2动态添加事件监听器

    如何在不使用 services yml 模式的情况下动态地将事件侦听器 在我的例子中是一个学说事件 添加到内核 在深入研究了供应商目录之后 我自己找到了答案appProdProjectContainer php文件 如果您希望使用事件管理器
  • 未找到“MongoId”类(带有 MongoDB Doctrine 的 Zend 框架)

    我目前正在尝试将 MongoDB 与 ZendFramework 中的 Doctrine 集成 我做了很多教程 在 StackOverflow 或其他地方 但没有任何效果 我一步步按照教程进行操作 http www bigwisu com
  • 从 FilterControllerEvent 监听器重定向到另一个 Symfony 路由

    我正在尝试设置一个 kernel controller 侦听器 以便在函数返回 true 时重定向到另一个路由 我有可用的路线 但无法使用此路线设置控制器 event gt setController 我收到以下错误 FilterContr
  • 运行 Composer 返回:“无法打开输入文件:composer.phar”

    我是 symfony2 和阅读新手symblog http tutorial symblog co uk tutorial parts 在第三章中 在尝试使用数据装置时 我尝试了以下命令 php composer phar update 但
  • symfony api 平台深度

    到目前为止 我们一直在 Symfony Doctrine 和 Serializer 深度方面苦苦挣扎 我希望能够使用 Symfony 提供一级深度的 JSON REST API 从而允许我直接从视图管理我的 外键 和关系逻辑 GET peo
  • 如何在 Symfony DateType 字段中设置日期范围?

    我需要在表单中的 dateType 字段的最小和最大日期上设置范围 我的代码在这里 public function buildForm FormBuilderInterface builder array options builder g
  • Doctrine 1 和 Symfony 1 的多个主键?

    我已经知道在 Symfony 1 和 Doctrine 1 中不可能使用多个主键 但是你们知道有什么好的解决方法吗 除了多对多关系之外 原则 1 不适用于多列上的主键 但如果你想使用多对多关系 请像这样使用 BlogPost columns
  • symfony easyadmin 自定义表单生成器

    我使用 symfony 3 4 和 easycorp easyadmin bundle 1 17 配置表单 easyadmin form fields type group label Basic Information icon enve
  • Symfony2 条件服务声明

    我目前正在尝试找到一个可靠的解决方案来动态更改 Symfony2 服务的依赖关系 详细信息 我有一个服务 它使用 HTTP 驱动程序与外部 API 进行通信 class myAwesomeService private httpDriver
  • 使用 Symfony 3 / Doctrine 进行属性形式的一对多对一

    问题是这样的 我有一个包含 3 个类的模型 person 人员 工作 job 一个人可以有多个工作 任何工作与人的关系都可以有 date start 属性 date end 和 comment 因此 我使用持有这些属性的可连接 person
  • 夏季化上方的树枝和行

    我对 twig 有点陌生 我知道可以在模板中添加值并将它们收集在变量中 但我真正需要的是在总结它们之前在模板中显示汇总值 我需要像旧 symfony 中的插槽之类的东西 或者在 php 中我可以通过 ob start 来做到这一点 以某种方
  • 如何为 symfony2 网站启用 gzip 压缩?

    我正在使用 servergrove 进行网站托管 但他们确实缺乏可以帮助我的员工 如何为 symfony2 站点设置 gzip 压缩 如果可能的话 以一种防白痴的方式 因为我对Linux一无所知 我将以下内容添加到 web 文件夹中的 ht
  • Symfony2:PrePersist/PreUpdate 生命周期事件未触发

    两个实体画廊相册 and 画廊图片具有 OneToMany ManyToOne 关系 One GalleryAlbum can have gt Many GalleryImage Many GalleryImage can be in gt
  • 无法访问扩展 Symfony\Bundle\FrameworkBundle\Controller\Controller 的控制器中的 Symfony2 容器

    原始问题 我已经阅读了 book http symfony com doc current book service container html 关于服务容器 我仍然感到困惑 因为几乎每次我尝试使用时 事情似乎都随机不起作用 this g
  • 从命令调用操作

    我想通过自定义命令执行操作 Controller php类的forward方法提供了这个功能 但是不知道从命令文件的execute 方法访问它 由于请求堆栈的原因 使控制器成为服务将导致性能开销 因为它应该返回一个HttpResponse
  • Symfony2 FosUserBundle 和 SonataUserBundle:覆盖实体?

    我将 FosUserBundle 和 SonataUserBundle 用于我的 Symfony2 项目 我现在很困惑 我想为实体用户添加字段 但它不起作用 例如 架构没有更新 这是我的配置 AppKernel new FOS UserBu

随机推荐

  • 公钥加密如何工作[重复]

    这个问题在这里已经有答案了 我对 RSA 的理解是 Alice 可以创建公钥和私钥组合 然后将公钥发送给 Bob 然后鲍勃可以使用公钥加密某些内容 而爱丽丝将使用公钥和私钥组合来解密它 但是 Alice 如何加密要发送给 Bob 的内容 鲍
  • Apache - 如何限制文件的最大下载速度? (如果不是apache,我可以运行lighthttpd)

    我有很多视频 但我只想将这些文件的最大下载速度限制为 1mbps 我该如何设置 最好在 Apache 中 但 lighthttpd 是一个选项 thanks 如果您只想限制每个连接的下载速度 而不考虑管理总数或执行更细粒度的控制 那么处理此
  • MySql 单表,选择最近 7 天并包含空行

    我在 stackoverflow 上搜索了类似的问题 但我不明白如何使这项工作 我正在尝试做什么 因此 我想从数据库中获取最近 7 天的交易并获取总销售额 如果某天没有数据 还包括空行 到目前为止我所拥有的 http sqlfiddle c
  • Angular-CLI 和 ThreeJS

    我一直在尝试添加适当的 npm 依赖项 以将三个依赖项添加到我的 Angular CLI 项目中 过去几个月 CLI 变化如此之快 我一直找不到工作源 这里有一些想法 搭载脚本 这是我的第一次尝试 简单地添加到index html 文件 但
  • 安装自定义 Cocoa 框架的最佳方法

    我有一个自定义框架 遵循 Apple 框架编程指南中的建议 gt gt 安装你的框架我安装在 Library Frameworks 中 我通过使用以下脚本添加运行脚本构建阶段来实现此目的 cp R build Debug MyFramewo
  • Android 中的 onResume() 是在 onRequestPermissionsResult() 之后调用的吗?

    我有一个活动 我已经把checkSelfPermission and requestPermissions中的方法onCreate method 我也有一个onRequestPermissionsResultonCreate 之外的方法 最
  • 加载时隐藏 jQuery Accordion

    我正在测试一个连接速度较慢的网站构建 我注意到 jQuery Accordion 会长时间保持展开状态 直到网站的其余部分加载完毕 然后最终崩溃 不太漂亮 我想知道如何在加载过程中保持它折叠并仅在单击时展开 我正在使用独立的 1 6 版本的
  • docker多阶段构建Go镜像-x509:由未知权威机构签名的证书

    我尝试建立go图像在私人公司网络使用docker 多阶段构建 FROM golang latest as builder WORKDIR app COPY go mod go sum RUN go mod download COPY RUN
  • 升级到 Android Studio 2.3 后 android-apt 的插件不兼容

    从 2 2 升级到 2 3 后 我看到此警告 当我尝试编译该项目时 我看到这个编译错误 如何在不降级到以前的 gradle 版本的情况下解决此问题 有没有 android apt 的更新可以解决这个问题 The android apt pl
  • 断言Equal和断言Is之间有什么区别(assertIs是在Python 2.7中引入的)?

    参考 http docs python org library unittest html assert methods assertEqual a b checks that a b assertIs a b checks that a
  • 逐渐旋转物体以面对一点?

    我正在制作一个 JavaScript 游戏 我希望敌方船只能够向指定点旋转 然后可以根据它们的角度计算它们的运动 仅当船舶位于其目标的下方和右侧时 以下旋转代码才有效 如果船在左边 它会旋转到约 0 度并在那里抖动 在右上角 它不断逆时针旋
  • 如何将列表中的各个元素与数字相乘?

    S 22 33 45 6 21 6 51 8 P 2 45 Here S是一个数组 我如何将其相乘并得到该值 SP 53 9 80 85 111 72 52 92 126 91 在 NumPy 中这非常简单 import numpy as
  • 如何在发送到服务器之前在 JavaScript 中压缩/gzip 用户数据?

    我对 JavaScript 还很陌生 我遇到过这样的情况 许多用户可以将大型 JSON 发送回服务器 为了限制流量 我想对它们进行 gzip 压缩 这在 JavaScript 中可能吗 如何从 JSON 的字符串表示形式创建字节数组 谢谢
  • Delphi:远离 VSS

    我们是由少数 Delphi 开发人员组成的团队 他们多年来一直在使用 VSS 我知道这很遗憾 但我们没有使用 VCS 的任何高级功能 因此它在很多情况下都工作正常 但有时它是快把我逼疯 VSS 的好处是我们使用第三方插件将 VSS 与 De
  • 使用 Oracle OLE DB 提供程序时如何解决 SQL 查询参数映射问题?

    当尝试使用 Oracle OLE DB 提供程序输入带参数的 SQL 查询时 出现以下错误 无法从 SQL 命令中提取参数 提供程序可能无法帮助解析命令中的参数信息 在这种情况下 请使用 来自变量的 SQL 命令 访问模式 其中整个 SQL
  • 在 OpenShift 中提供 Django 静态文件

    根据2014 年 3 月博客文章 OpenShift 现在删除了一些目录 如 wsgi wsgi static data 和 libs 鉴于我使用 wsgi static 来实现此目的 从现在开始我应该如何提供 django 静态文件 根据
  • 想要使用向量作为函数的参数,而不必分隔其元素

    如果我使用以下命令调用 matlab 函数 函数 1 2 3 4 5 它工作得很好 但如果我这样做 a 1 2 3 4 5 a 1 2 3 4 5 给出相同的结果 then func a 给我 错误 gt 函数位于 11 没有足够的输入参数
  • 使用 Java Native Interface 的缺点

    我无法理解使用 JNI 的这两个缺点 我想更多地了解他们 很难调试运行时错误 本机代码 JNI 代码中的错误会导致整个 JVM 崩溃 并且不提供任何正常恢复机制 调试困难 您需要一个 C C 调试器来调试本机代码 不可能轻松地从 Java
  • 加载 GIF(预加载器)仅在 Chrome 上卡住

    我的网站上有一个画廊 该图库包含 15 张图片 每张约 500KB 总大小为 7 5MB 因为图库需要一段时间才能加载 在我的计算机上需要 25 秒 这取决于连接情况 我希望访问者知道图库正在加载 因此Ajax 加载 GIF 我希望访问者一
  • 按相关实体字段对 Sonata Admin 中的列表视图进行排序

    使用 Sonata Admin Bundle 这是 Symfony 的一个很棒的附加组件 时 我遇到了如下所述的问题 假设我们有 3 个实体 城市 州和国家 他们都有属性id and name 城市与州之间存在多对一的关系 州与国家之间存在