You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 04:06:08