跳到内容

EasyAdmin 关联字段

编辑此页

此字段显示用于关联 Doctrine 实体之间属性的内容 (任何类型:一对一、一对多等)。在表单页面中,此字段使用基于 TomSelect 库的高级自动完成小部件呈现。

表单页面(编辑和新建)中,它看起来像这样

Default style of EasyAdmin association field

在只读页面(indexdetail)中,它显示为指向相关实体的 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 实体或与 IpAddres 实体相关的 Server 实体相关的 Customer 实体。

在这些情况下,显示包含所有(可能数百万!)地址的下拉列表是没有意义的。相反,最好在您正在创建或编辑的实体(例如 Customer)的表单中嵌入相关实体(例如 Address)的表单字段。

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

默认情况下,select 列表中显示的项目的 HTML 内容会被转义,以避免像 XSS 这样的安全问题。如果您需要呈现自定义 HTML 内容,并且您确定它们可以安全地“按原样”显示,请设置此选项以不转义这些内容

1
yield AssociationField::new('...')->renderAsHtml();

setCrudController

在只读页面(indexdetail)中,此字段显示为指向相关实体的 detail 页面的可点击链接。

默认情况下,EasyAdmin 会自动查找相关实体的 CRUD 控制器。但是,如果您为该实体定义了多个 CRUD 控制器,则需要使用此选项来指定要用于链接的控制器

1
yield AssociationField::new('...')->setCrudController(SomeCrudController::class);

setQueryBuilder

默认情况下,EasyAdmin 使用通用数据库查询来查找相关实体的项目。如果您需要使用自定义查询来过滤结果或以某种特定方式对其进行排序,请使用此选项。

类似于 Symfony 的 EntityTypequery_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')
);

当自定义查询很复杂并且已在实体存储库中定义时,使用可调用对象更方便,因为它们在应用程序的其他部分中重用。使用可调用对象时,Symfony 会自动将 QueryBuilder 作为第一个参数注入

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');
这项工作,包括代码示例,根据 Creative Commons BY-SA 3.0 许可获得许可。
目录
    版本