我想添加不在我的实体中的列,并且需要一些自定义查询/子查询。例如。我有一个分配有用户的实体,我想要一个列来显示用户计数,但仅显示活动用户或仅在某个日期后创建的用户。我试图向查询生成器添加一个字段,但随后出现与“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
]
通常您只有实体数组,而不是具有实体和自定义值的数组数组。
我找到了解决这个问题的办法。它并不完美,因为您需要每行查询数据库。另外,感觉有点hacky。
您可以添加模型中不存在的列,这很好。方法
setValue
不能接受可调用,但 foramtValue
可以,所以这样的方法效果很好
yield TextField::new('userCount')
->setValue('0')
->formatValue(function ($value, $entity) {
return $this->userRepository->count(['company' => $entity->getId()]);
})
->onlyOnIndex();
您需要将该值设置为某个默认值才能使
formatValue
正常工作。