我该怎么办?学说关系

时间:2014-09-15 10:25:54

标签: symfony doctrine-orm

我想用以下字段创建动态表单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;

1 个答案:

答案 0 :(得分:0)

我认为问题在于您将“相册”作为单个实体字段添加到“照片”表单中,但您的选项意味着它会被转换为一组复选框,这些复选框在逻辑上打开,由Symfony提交到ArrayList中。您的Photo实体只需要一个相册。

你能发布你的Photo实体的其余部分,特别是setAlbum方法(如果在这种情况下你实际上不需要创建一个,我会道歉,即使它们是微不足道的,我总是创建它!)

如果Photo是ManyToOne with Album,那么很多照片可以在一个相册中,而且Album字段应该是一个下拉列表 - 您不应该选择多个相册。这可能是问题的根源。

如果许多照片可以在一个相册中,但每张照片都可以在很多相册中,那么你真的有一个ManyToMany关系,似乎没有像这样建模。