EasyAdmin 关联字段
此字段显示用于关联 Doctrine 实体之间属性的内容(任何类型:一对一、一对多等)。在表单页面中,此字段使用基于 TomSelect 库的高级自动完成小部件渲染。
在表单页面(编辑和新建)中,它看起来像这样

在只读页面(index
和 detail
)中,它显示为指向相关实体详情操作的可点击链接。
基本信息
- PHP 类:
EasyCorp
\Bundle \EasyAdminBundle \Field \AssociationField - Doctrine DBAL 类型 用于存储此值:
integer
,guid
或你用于存储关联实体 ID 的任何其他类型 - Symfony 表单类型 用于渲染此字段: EntityType
渲染为:
1 2
<!-- when loading the page this is transformed into a dynamic field via JavaScript --> <select> ... </select>
选项
autocomplete
默认情况下,此字段加载相关实体的所有可能值。当该实体有数百或数千个值时,这会创建“内存不足”错误。使用此选项可以根据用户输入动态加载值(通过 Ajax 请求)
1
yield AssociationField::new('...')->autocomplete();
renderAsNativeWidget
默认情况下,此字段使用 TomSelect 库创建的高级 JavaScript 小部件渲染。如果你更喜欢显示标准的 <select>
元素,请使用此选项
1
yield AssociationField::new('...')->renderAsNativeWidget();
renderAsEmbeddedForm
默认情况下,一对一关联在表单中渲染为下拉列表,你可以在其中选择给定的值之一。例如,与一位作者关联的博客文章将显示一个下拉列表,以选择一位可用的作者。
然而,有时关联的属性指的是值对象。例如,与 Address
实体相关的 Customer
实体,或与 IpAddres
实体相关的 Server
实体。
在这些情况下,显示包含所有(可能数百万!)地址的下拉列表是没有意义的。相反,最好将相关实体的表单字段(例如 Address
)嵌入到你正在创建或编辑的实体(例如 Customer
)的表单中。
renderAsEmbeddedForm()
选项告诉 EasyAdmin 嵌入关联属性的 CRUD 表单,而不是在下拉列表中显示其所有可能的值
1
yield AssociationField::new('...')->renderAsEmbeddedForm();
EasyAdmin 会自动查找与属性关联的 CRUD 控制器。如果你需要更好地控制要使用哪个 CRUD 控制器,请将控制器的完全限定类名作为第一个参数传递
1 2 3 4 5 6 7 8
yield AssociationField::new('...')->renderAsEmbeddedForm(CategoryCrudController::class);
// the other optional arguments are the page names passed to the configureFields()
// method of the CRUD controller (this allows you to have a better control of
// the fields displayed on different scenarios)
yield AssociationField::new('...')->renderAsEmbeddedForm(
CategoryCrudController::class, 'create_category_inside_an_article', 'edit_category_inside_an_article'
);
renderAsHtml
默认情况下,显示在选择列表中的项目的 HTML 内容会被转义,以避免像 XSS 这样的安全问题。如果你需要渲染自定义 HTML 内容,并且你确信它们可以安全地“按原样”显示,请设置此选项以不转义这些内容
1
yield AssociationField::new('...')->renderAsHtml();
setCrudController
在只读页面(index
和 detail
)中,此字段显示为指向相关实体详情页面的可点击链接。
默认情况下,EasyAdmin 会自动查找相关实体的 CRUD 控制器。但是,如果你为该实体定义了多个 CRUD 控制器,则需要使用此选项来指定链接要使用哪一个
1
yield AssociationField::new('...')->setCrudController(SomeCrudController::class);
setQueryBuilder
默认情况下,EasyAdmin 使用通用数据库查询来查找相关实体的项目。如果你需要使用自定义查询来过滤结果或以某种特定方式对其进行排序,请使用此选项。
类似于 Symfony 的 query_builder 选项,此选项的值可以是 Doctrine\ORM\QueryBuilder
对象或 callable
。
当自定义查询很短且不在应用程序的其他地方重用时,你可以使用 QueryBuilder
对象
1 2 3 4 5 6 7 8 9
// get the entity repository somehow...
$someRepository = $this->entityManager->getRepository(SomeEntity::class);
yield AssociationField::new('...')->setQueryBuilder(
$someRepository->createQueryBuilder('entity')
->where('entity.some_property = :some_value')
->setParameter('some_value', '...')
->orderBy('entity.some_property', 'ASC')
);
当自定义查询复杂且已在实体存储库中定义时,使用 callable 更方便,因为它们在应用程序的其他部分重用。当使用 callable 时,QueryBuilder
由 Symfony 自动注入为第一个参数
1 2 3
yield AssociationField::new('...')->setQueryBuilder(
fn (QueryBuilder $queryBuilder) => $queryBuilder->addCriteria('...')
);
或者,如果你更喜欢使用实体的存储库
1 2 3
yield AssociationField::new('...')->setQueryBuilder(
fn (QueryBuilder $queryBuilder) => $queryBuilder->getEntityManager()->getRepository(Foo::class)->findBySomeCriteria();
);
setSortProperty
如果你使用关联字段对 index
页面结果进行排序,则默认情况下,这些结果使用关联实体的 id
属性进行排序。设置此选项以使用关联实体的任何其他属性对结果进行排序
1
yield AssociationField::new('user')->setSortProperty('name');