Symfony2实体表单类型从另一个实体获取数据



我有两个实体:Audio和Destination

在音频:

/**
     * @ORMOneToOne(targetEntity="HearWeGoHearWeGoBundleEntityDestination", inversedBy="audio")
     * @AssertNotBlank(message="This field must be filled")
     * 
     */
    private $destination;

我创建了一个表单类型名称EditAudioType用于编辑音频,其上传的链接存储在数据库

<?php
namespace HearWeGoHearWeGoBundleForm;
use SymfonyComponentFormAbstractType;
use SymfonyComponentFormFormBuilderInterface;
use SymfonyComponentOptionsResolverOptionsResolver;
use HearWeGoHearWeGoBundleEntityAudio;
class AudioAudioType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $destination_repo=$options['dr'];
        $builder
            ->add('name','text')
            ->add('audio','file')
            ->add('destination','entity',array(
                'class'=>'HearWeGoHearWeGoBundle:Destination',
                'choices'=>$destination_repo->findToReplaceAudio('id'),
                'property'=>'name'
            ));
    }
    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(array('data_class'=>"HearWeGo\HearWeGoBundle\Entity\Audio"));
        $resolver->setRequired(array('dr'));
    }
    public function getName()
    {
        return 'edit_audio';
    }
}

我在我的旧帖子中做了类似的回答:Symfony2实体表单类型获取数据

但是现在我不知道该在form的choices属性中放什么,因为这个自定义的repo函数有参数,不像以前的答案。In DestinationRepository:

    public function findByAudioId($id)
        {
            return $this->getEntityManager()->createQuery('SELECT d FROM HearWeGoHearWeGoBundle:Destination d,HearWeGoHearWeGoBundle:Audio a WHERE d.id=IDENTITY (a.destination)')->getResult();
        }
   public function findToReplaceAudio($id)
        {
            $result=$this->findDestinationWithoutAudio();
            $result[]=$this->findByAudioId($id);
            return $result;
        }

我将这样做:

<?php
namespace HearWeGoHearWeGoBundleForm;
use SymfonyComponentFormAbstractType;
use SymfonyComponentFormFormBuilderInterface;
use SymfonyComponentOptionsResolverOptionsResolver;
use HearWeGoHearWeGoBundleEntityAudio;
use HearWeGoHearWeGoBundleEntityRepositoryAudioRepository;
class AudioAudioType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('name','text')
            ->add('audio','file')
            ->add('destination','entity',array(
                'class'=>'HearWeGoHearWeGoBundle:Destination',
                'query_builder'=>function (AudioRepository $repository) {
                    return $repository->findToReplaceAudioQueryBuilder('id');
                },
                'property' => 'name'
            ));
    }
    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(array('data_class'=>"HearWeGo\HearWeGoBundle\Entity\Audio"));
    }
    public function getName()
    {
        return 'edit_audio';
    }
}

请查阅官方文件