Symfony 2使用从第一个实体生成的ID从表单中获取2个实体

时间:2015-06-12 12:08:41

标签: php symfony doctrine-orm

我有一个表单,用于从两个相关实体收集数据'工作'和'范围'。作业数据成功添加到数据库,但我无法添加要添加的作用域实体,这也需要从作业条目创建的唯一ID。我顺便使用了学说。

这是jobsType:

class jobsType extends AbstractType
{

    public function buildForm(FormBuilderInterface $builder, array $options)
    {

        $builder
            ->add('jobNumber', null,  array('label' => 'Job Number','attr' => array('placeholder'=>'Code used for job')))

        ->add('description', null,  array('label' => 'Job Description',))

        ;

        $builder->add('scopes', new scopeType())
        ;

    }
    public function getName()
    {
        return 'jobs';
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(array(
                'data_class' => 'Baker\TimeSlipBundle\Entity\Jobs',
        ));
    }

}

这是scopeType

    class scopeType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder

        ->add('description', 'entity', array('label' => 'Scope', 'required' => false,
                'class' => 'BakerTimeSlipBundle:Scope',
                'query_builder' => function(EntityRepository $er){
                    return $er->createQueryBuilder('s')
                    ->orderBy('s.description', 'asc');
                },
                'property' => 'description',
                'multiple' => false,
                'expanded' => false,
                'empty_value' => false,
                'attr' => array('class' => 'form-inline'),
                'label_attr' => array('class' => 'required')
        ))

        ;
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(array(
                'data_class' => 'Baker\TimeSlipBundle\Entity\Scope',
        ));
    }

    public function getName()
    {
        return 'scope';
    }
}

这是我的控制器,我认为这里的问题是我没有将scope()实例传递给表单构建器。我不知道该怎么做。实体已正确映射。

class JobsController extends Controller
{

    public function indexAction($limit, Request $request)
    {

        $jobs= new Jobs();
        $scope = new Scope();   

        $fname=$limit;
        $form = $this->createForm(new JobsType(),$jobs, array(
                'method' => 'POST',
        ));
        $form->handleRequest($request);

        if ($form->isValid()) {

            $em = $this->getDoctrine()->getManager();
                        $em->persist($jobs);
                        $em->persist($scope);
            $em->flush();

            return $this->redirectToRoute('company',array ('limit' =>'Job Submitted Successfully'));
        }


        return $this->render(
                'BakerTimeSlipBundle:Jobs:index.html.twig',
                array('fname' => $fname,
                        'form' => $form->createView()

                )
        );

        }
    }
}

这里的任何帮助将不胜感激。下面列出了我尝试输入范围时的错误消息:

  

执行' INSERT INTO Scope(description,jobsId,jobsid)VALUES(?,?,?)'使用params [null,null,null]:   SQLSTATE [42000]:语法错误或访问冲突:1110列' jobsId'指定两次

1 个答案:

答案 0 :(得分:0)

这里的问题是你链接到表单的$ jobs对象与$ scope对象没有关系。因此,当你试图坚持$ jobs时,Doctrine不知道它必须坚持的范围。

试试这个:

$jobs= new Jobs();
$scope = new Scope();
$jobs->setScope($scope);

然后,在你的Jobs实体中,在$ scopes上面的注释上,确保你有cascade={"persist"}(但是你必须已经拥有它,因为Doctrine试图保持,并且那就是抛出错误的地方),你应该好好去。

希望这有帮助