Php 在symfony中将实体用作EntityType输入筛选器的参数

Php 在symfony中将实体用作EntityType输入筛选器的参数,php,forms,symfony,filtering,query-builder,Php,Forms,Symfony,Filtering,Query Builder,我要做的是使用传递给控制器中createForm方法的实体来过滤EntityType字段 实体是相关的: 员工('1')---('1')用户('M')----('1')票证客户('M')----('1')票证 用户('M')---('1')票证 我想做的是使用ticket与ticketqueue的关系,以便能够将用户字段筛选为仅具有员工配置文件且分配给分配了ticket的队列的用户 到目前为止,这就是我所处的位置: 我成功地满足了以下条件: -仅具有员工档案的用户 -仅限具有指定队列的用户 但我

我要做的是使用传递给控制器中createForm方法的实体来过滤EntityType字段

实体是相关的:

员工('1')---('1')用户('M')----('1')票证客户('M')----('1')票证

用户('M')---('1')票证

我想做的是使用ticket与ticketqueue的关系,以便能够将用户字段筛选为仅具有员工配置文件且分配给分配了ticket的队列的用户

到目前为止,这就是我所处的位置:

我成功地满足了以下条件: -仅具有员工档案的用户 -仅限具有指定队列的用户

但我还不知道如何使用where语句筛选出,where TICKTQUEUE=“无论票证分配给什么”

现在,此表单仅在编辑票证状态和受让人(用户)时使用

表格类别:

class TicketUpdateType extends AbstractType {

public function buildForm(FormBuilderInterface $builder, array $options) {
    $builder
            ->add('assignedto', EntityType::class, array('multiple' => false,
                'class' => 'AuthBundle\Entity\User', 'placeholder' => 'Select Personel', 
                    'query_builder' => function (UserRepository $er) {
                        return $er->createQueryBuilder('u')
                        ->select('u') 
                        ->join('u.employee','e')
                        ->join('u.ticketQueues','tq')                                  
                        ->orderBy('u.username', 'ASC');                                                  
                    },
                'label' => "Assigned To:",
                'choice_label' => function
                ($q) {
                    return $q->getEmployee()->getFirstName()." ".$q->getEmployee()->getLastName();
                }, 'attr' => array('class' => 'form-control')))                   
            ->add('ticketstatus', EntityType::class, array('multiple' => false,
                'class' => 'TicketBundle\Entity\TicketStatus', 'placeholder' => 'Select Status','label' => "Ticket Status", 'choice_label' => function
                ($q) {
                    return $q->getName();
                }, 'attr' => array('class' => 'form-control')));               
}

public function configureOptions(OptionsResolver $resolver) {
    $resolver->setDefaults(array(
        'data_class' => Ticket::class,
    ));
}
}
编辑:

表格:

事件订阅者:

class AddQueueFieldSubscriber implements EventSubscriberInterface{

public static function getSubscribedEvents()
{
    // Tells the dispatcher that you want to listen on the form.pre_set_data
    // event and that the preSetData method should be called.
    return array(FormEvents::PRE_SET_DATA => 'preSetData');
}


public function preSetData(FormEvent $event)
{
    $ticket = $event->getData();
    $form = $event->getForm();
    $queue = $event->getData()->getTicketQueue()->getName();

    if ($ticket) {
        $form->add('assignedto', EntityType::class, array('multiple' => false,
                'class' => 'AuthBundle\Entity\User', 'placeholder' => 'Select Personel', 
                    'query_builder' => function (UserRepository $er) use ($queue){
                        return $er->createQueryBuilder('u')
                        ->select('u') 
                        ->join('u.employee','e')
                        ->join('u.ticketQueues','tq')   
                        ->where('tq.name = :queue')        
                        ->orderBy('u.username', 'ASC')
                        ->setParameter('queue', $queue);        
                    },
                'label' => "Assigned To:",
                'choice_label' => function
                ($q) {
                    return $q->getEmployee()->getFirstName()." ".$q->getEmployee()->getLastName();
                }, 'attr' => array('class' => 'form-control')));  
    }
}    
}
“我要做的是使用传递给控制器中createForm方法的实体筛选EntityType字段。”

您需要在表单中使用PRE_SET_DATA函数:

此功能允许您准备表单

例如:

$builder->addEventListener(
        FormEvents::PRE_SET_DATA,
        function (FormEvent $event) {
            $form = $event->getForm();
            $entity = $event->getData();

            if (!$entity->getEnabled()) {
                $form->remove('validity');
            }
        }
    );
不要忘记使用控制器中的实体初始化表单:

$form=$this->createForm(TicketUpdateType::class,$yourEntity);


祝你好运

为什么不添加到查询生成器:->where('u.TicketQueue=1')?这会适应另一个具有不同队列的票证吗?我想要的是只显示与问题中的票证具有相同队列的用户。我想您需要使用一些多连接语句$qb->select('u')->from('AuthBundle\Entity\User',s')->join('AuthBundle\Entity\User','e')->where('u.User=s.User')->和where('u.TicketQueue=s.TicketQueue')发布完整的表单类。
$builder->addEventListener(
        FormEvents::PRE_SET_DATA,
        function (FormEvent $event) {
            $form = $event->getForm();
            $entity = $event->getData();

            if (!$entity->getEnabled()) {
                $form->remove('validity');
            }
        }
    );