我可以仅使用 getter 填充 Sonata 实体导出吗?

问题描述

我正在为一家使用 Sonata 的媒体公司构建一个非常简单的计费系统,其中包括用于支付记者费用的支付实体。付款的唯一目的是导出到电子表格。我们绝不会直接编辑付款。

我的 Payment 实体中有一堆特殊的 getter,它们不直接对应于该实体的属性。类似的东西:

public function getReporterName():string
{
    return
        $this->reporter->getUser()->getFirstname() .
        ' ' .
        $this->reporter->getUser()->getLastname()
        ;
}

在此实体的 Sonata 管理类中,我已告诉我的列表视图将 reporterName 显示为一个属性。 Sonata 足够聪明,可以找到并使用 getter 来检索我正在寻找的字符串。没问题。

当我将该伪字段名称添加到 configureDatagridFilters() 方法时,问题就出现了:

protected function configureDatagridFilters(DatagridMapper $datagridMapper)
{
    $datagridMapper
        ->add('id')
        ->add('paymentComplete')
        ->add('reporterName')
    ;
}

现在我在尝试导出电子表格时收到一条令人讨厌的消息,内容如下:

未找到属性的元数据 AppBundle\Entity\Payment::$reporterName。请确保您的 正确配置了 Doctrine 映射。

有没有办法做我在这里想做的事情?还是我只需要把它搞定并在数据库中复制一些数据才能使我的导出工作?

如果有帮助,我会在此重申,我们需要此实体来导出到电子表格。它永远不会被手动编辑。

解决方法

我认为您无法使用两个字段(除非您为 完整 名称添加一个 映射 字段)。
您可以use the dot syntax to filter by sub entity properties

protected function configureDatagridFilters(DatagridMapper $datagridMapper)
{
    $datagridMapper
        ->add('id')
        ->add('paymentComplete')
        ->add('reporter.user.firstname',null,['label' => 'Reporter Firstname'])
        ->add('reporter.user.lastname',['label' => 'Reporter Lastname'])
    ;
}
,

我最终使用专用导出方法来解决这个问题。

https://symfony.com/doc/current/bundles/SonataAdminBundle/reference/action_export.html

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...