Symfony如何将Company实体从CollectionType父表单传递到子EntryType筛选用户
实现步骤
1. 调整ProjectContactType的选项配置
首先给ProjectContactType的OptionsResolver添加必填的company参数,声明该表单需要接收Company实体:
// 头部记得引入你的Company实体类 use App\Entity\Company; public function configureOptions(OptionsResolver $resolver): void { $resolver ->setDefaults([ 'data_class' => ProjectContact::class, ]) ->setRequired([ 'company' ]) // 可选:限制传入参数的类型为Company实体 ->setAllowedTypes('company', Company::class); }
2. 在ProjectType中给子表单传递Company参数
修改ProjectType里CollectionType的配置,通过entry_options将当前表单拿到的Company参数传递给每一个ProjectContactType子表单:
public function buildForm(FormBuilderInterface $builder, array $options): void { $builder ->add('name', TextType::class) ->add('projectContacts', CollectionType::class, [ 'label' => false, 'entry_type' => ProjectContactType::class, // 新增这一行,给子表单传递参数 'entry_options' => ['company' => $options['company']], 'by_reference' => false, 'allow_add' => true, 'allow_delete' => true, ]); }
3. 在ProjectContactType中筛选用户列表
修改user字段的配置,添加query_builder参数,用传入的Company实体筛选属于该公司的用户(以下代码默认User和Company为多对一关联,可根据你的实际关联关系调整查询条件):
// 头部记得引入你的UserRepository类 use App\Repository\UserRepository; public function buildForm(FormBuilderInterface $builder, array $options): void { $builder ->add('user', EntityType::class, [ 'placeholder' => 'Choisir un client', 'required' => true, 'class' => User::class, 'choice_label' => function (User $user) { return $user->getFirstName() . " " . $user->getLastName(); }, // 新增查询条件筛选同公司用户 'query_builder' => function (UserRepository $er) use ($options) { return $er->createQueryBuilder('u') ->where('u.company = :targetCompany') ->setParameter('targetCompany', $options['company']); } ]); }
如果你的User和Company是多对多关联,只需要把查询条件修改为:
->where(':targetCompany MEMBER OF u.companies')
内容的提问来源于stack exchange,提问作者LeMarsh
相关产品推荐
相关产品推荐

