我想用以下字段创建动态表单Photo:
相册是一个复选框字段(带有'multiple'attr)。
Photo与Album有很多关系。
我想要做的是多次使用不同的相册值保留照片,而不是在一张照片中保留一组arrayCollection的相册。
我试着做
if($ request-> getMethod()=='POST'){
$form->bind($request); if ($form->isValid()) { $data = $form->getData(); $listeAlbum = $data['album']; foreach ($listeAlbum as $album) { $em->persist($photo); $em->flush(); }
我收到错误(在行绑定 - >($ request))
Catchable Fatal Error: Argument 1 passed to MySite\TestBundle\Entity
\Photo::setAlbum() must be an instance of MySite\TestBundle\Entity\Album,
instance of Doctrine\Common\Collections\ArrayCollection given, ...
有办法做到这一点吗?
编辑:更多代码。
我的表单类型
类PhotoType扩展AbstractType {
private $securityContext; public function __construct(SecurityContext $securityContext) { $this->securityContext = $securityContext; } public function buildForm(FormBuilderInterface $builder, array $options) { $builder->add('file', 'file') // , array("attr" => array("multiple" => "multiple", )) ->add('titre'); $user = $this->securityContext->getToken()->getUser(); if (!$user) { throw new \LogicException( 'The FriendMessageFormType cannot be used without an authenticated user!' ); } $builder->addEventListener( FormEvents::PRE_SET_DATA, function (FormEvent $event) use ($user) { $form = $event->getForm(); $formOptions = array( 'multiple' => true, //several choices 'expanded' => true, // activate checkbox instead of list 'class' => 'EVeilleur\DefuntBundle\Entity\Album', 'property' => 'titre', 'query_builder' => function (EntityRepository $er) use ($user) { // build a custom query return $er->createQueryBuilder('u')->add('select', 'u') ->add('from', 'EVeilleurDefuntBundle:Album u'); // ->add('where', 'u.id = ?1') // ->add('orderBy', 'u.name ASC'); }, ); // create the field, = $builder->add() // field name, field type, data, options $form->add('album', 'entity', $formOptions); } ); } /** * @param OptionsResolverInterface $resolver */ public function setDefaultOptions(OptionsResolverInterface $resolver) { $resolver->setDefaults(array( 'data_class' => 'EVeilleur\DefuntBundle\Entity\Photo' )); } /** * @return string */ public function getName() { return 'eveilleur_defuntbundle_photo'; } }
实体关系,在Photo.php中
/** * @ORM\ManyToOne(targetEntity="EVeilleur\DefuntBundle\Entity\Album") * @ORM\JoinColumn(nullable=true) */ private $album;
答案 0 :(得分:0)
我认为问题在于您将“相册”作为单个实体字段添加到“照片”表单中,但您的选项意味着它会被转换为一组复选框,这些复选框在逻辑上打开,由Symfony提交到ArrayList中。您的Photo实体只需要一个相册。
你能发布你的Photo实体的其余部分,特别是setAlbum方法(如果在这种情况下你实际上不需要创建一个,我会道歉,即使它们是微不足道的,我总是创建它!)
如果Photo是ManyToOne with Album,那么很多照片可以在一个相册中,而且Album字段应该是一个下拉列表 - 您不应该选择多个相册。这可能是问题的根源。
如果许多照片可以在一个相册中,但每张照片都可以在很多相册中,那么你真的有一个ManyToMany关系,似乎没有像这样建模。