我有一个表单,用于从两个相关实体收集数据'工作'和'范围'。作业数据成功添加到数据库,但我无法添加要添加的作用域实体,这也需要从作业条目创建的唯一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'指定两次
答案 0 :(得分:0)
这里的问题是你链接到表单的$ jobs对象与$ scope对象没有关系。因此,当你试图坚持$ jobs时,Doctrine不知道它必须坚持的范围。
试试这个:
$jobs= new Jobs();
$scope = new Scope();
$jobs->setScope($scope);
然后,在你的Jobs实体中,在$ scopes上面的注释上,确保你有cascade={"persist"}
(但是你必须已经拥有它,因为Doctrine试图保持,并且那就是抛出错误的地方),你应该好好去。
希望这有帮助