EasyAdmin 3.X - 如何查看相关实体 `toString` 而不是列表中的关联数?
Posted
技术标签:
【中文标题】EasyAdmin 3.X - 如何查看相关实体 `toString` 而不是列表中的关联数?【英文标题】:EasyAdmin 3.X - How to see related entities `toString` instead of the number of association in the list? 【发布时间】:2020-12-22 23:08:49 【问题描述】:我有一个实体 Product
与实体 Category
具有多对多关系
/**
* @ORM\ManyToMany(targetEntity="App\Domain\Category", inversedBy="stalls")
*/
private $categories;
//...
/**
* @return Collection|Category[]
*/
public function getCategories(): Collection
return $this->categories;
在ProductCrudController
类中,我有以下configureFields
方法:
public function configureFields(string $pageName): iterable
return [
Field::new('name'),
Field::new('description'),
AssociationField::new('categories'),
];
在创建/编辑Product
时,关系中的一切都按预期工作,但在产品列表中,我看到的不是相关类别,而是产品的类别数量。我该如何改变这种行为?
在下图中,第一个产品有 1 个类别,列表中的第二个产品有 2 个不同的类别。我希望在此处显示类别的名称。
附带说明:Category
类有一个 __toString
方法返回类别名称。
编辑:
我正在寻找的行为与下图中的Tags
列相同:
【问题讨论】:
【参考方案1】:你可以像这样制作一个模板:
// somewhere here templates/admin/field/category.html.twig
% for category in field.value %
%- set url = ea_url()
.setController('Path\\To\\Your\\CategoryCrudController')
.setAction('detail')
.setEntityId(category.id)
-%
<a href=" url ">
category.name % if not loop.last %, % endif %
</a>
% else %
<span class="badge badge-secondary">None</span>
% endfor %
然后将其添加到字段中
// in ProductCrudController
AssociationField::new('categories')->setTemplatePath('admin/field/category.html.twig'),
【讨论】:
这个应该是正确的答案,imo【参考方案2】:您可以像这样使用formatValue
方法格式化值:
->formatValue(function ($value, $entity)
$str = $entity->getCategories()[0];
for ($i = 1; $i < $entity->getCategories()->count(); $i++)
$str = $str . ", " . $entity->getCategories()[$i];
return $str;
)
【讨论】:
我会试试这个formatValue
func,谢谢。为了您的解决方案,也许您可以使用implode
(php.net/manual/en/function.implode.php) 返回相同的结果?
非常好的解决方案,但请注意,如果您需要对多个实体进行此操作,则当前形式的此方法不允许代码重用。【参考方案3】:
我在详细信息页面上遇到了同样的问题。因此,我没有使用模板,而是根据pagename
更改字段类型
if (Crud::PAGE_DETAIL === $pageName)
$field = ArrayField::new('field')->setLabel('label');
else
$field = AssociationField::new('field')->setLabel('label');
【讨论】:
【参考方案4】:在 crud 控制器中使用 ArrayField::new('categories'),
而不是 AssociationField::new('categories'),
。
现在创建/编辑产品时,显示有所不同,但足够好
【讨论】:
以上是关于EasyAdmin 3.X - 如何查看相关实体 `toString` 而不是列表中的关联数?的主要内容,如果未能解决你的问题,请参考以下文章
EasyAdmin 3:如何基于 dql 为 CRUD 索引显示实体
用户如何在 EasyAdmin 中查看自己的产品,而管理员可以查看所有产品?