EasyAdmin,如何向网格添加自定义列?

问题描述 投票:0回答:1

我想添加不在我的实体中的列,并且需要一些自定义查询/子查询。例如。我有一个分配有用户的实体,我想要一个列来显示用户计数,但仅显示活动用户或仅在某个日期后创建的用户。我试图向查询生成器添加一个字段,但随后出现与“id as an array”相关的错误。使用 Easyadmin 可以吗?

为了测试,我试图向查询生成器添加任何字段

public function createIndexQueryBuilder(SearchDto $searchDto, EntityDto $entityDto, FieldCollection $fields, FilterCollection $filters): QueryBuilder
{
[...]
    $queryBuilder->addSelect('1 AS userCount');
    return $queryBuilder;
}

但后来我犯了错误

Cannot read property "id" from an array. Maybe you intended to write the property path as "[id]" instead.
我从 AbstractCrudController::index 中转储了分页器,发现结果现在几乎没有不同的结构

  -results: ArrayIterator {#900 ▼
    -storage: array:10 [▼
      0 => array:2 [▼
        0 => App\Entity\Company {#916 ▶}
        "userCount" => 1
      ]
      1 => array:2 [▼
        0 => App\Entity\Company {#814 ▶}
        "userCount" => 1
      ]

通常您只有实体数组,而不是具有实体和自定义值的数组数组。

php symfony crud easyadmin
1个回答
2
投票

我找到了解决这个问题的办法。它并不完美,因为您需要每行查询数据库。另外,感觉有点hacky。

您可以添加模型中不存在的列,这很好。方法

setValue
不能接受可调用,但
foramtValue
可以,所以这样的方法效果很好

   yield TextField::new('userCount')
            ->setValue('0')
            ->formatValue(function ($value, $entity) {
                return $this->userRepository->count(['company' => $entity->getId()]);
            })
            ->onlyOnIndex();

您需要将该值设置为某个默认值才能使

formatValue
正常工作。

© www.soinside.com 2019 - 2024. All rights reserved.