2015-06-12 1 views
0

У меня есть форма, которая собирает данные из двух заданий «Объекты» и «Область действия». Данные о заданиях успешно добавляются в базу данных, но я не могу получить добавленную сущность области, которая также требует уникальный идентификатор, который был создан из записи заданий. Кстати, я использую доктрину.Symfony 2 persiting 2 сущности из формы с использованием идентификатора, сгенерированного из первого объекта

Вот 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'; 
    } 
} 

Вот мой контроллер, я думаю, что проблема здесь в том, что я не передавая экземпляр сфера() в форме строитель. Который я не уверен, как это сделать. Объект правильно отображается.

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 (описание, jobsId, jobsid) VALUES' с Params [нуль, NULL, NULL]: SQLSTATE [42000]: ошибка синтаксиса или нарушение прав доступа: 1110 Колонка «jobsId» указан дважды

+0

Конечно, не связанные, но вы должны иметь вашу форму обработки запроса только 'если ($ request-> isMethod ('POST')) {}'. Кроме того, вы должны получить '$ jobs', выполнив' $ jobs = $ form-> getData(); '. – D4V1D

+0

спасибо за совет, я решил позволить доктрине обрабатывать зависимости, которые вы должны использовать $ this-> getDoctrine() -> getManager(); – user3248331

ответ

0

проблема здесь в $ задания объекта вы связываете к вашей форме не имеет никакого отношения к $ объеме объект. Поэтому, когда вы пытаетесь сохранить $ jobs, Doctrine не имеет понятия $ scope, который он должен был сохранить.

Просто попробуйте это:

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

Тогда, в заданиях сущности, на аннотацию выше $ прицелы, убедитесь, что у вас есть cascade={"persist"} (но вы должны уже иметь его, потому что доктрина пытается упорствовать, и там ошибка бросается), и вам должно быть хорошо идти.

Надеется, что это помогает

+0

Хм, у меня нет метода setScope. Где это должно быть создано? – user3248331

+0

Ваш объект должен иметь стандартные получатели и сеттеры для свойства scope. Если нет, добавьте их. И еще более общие, проверяйте каждое свойство каждого объекта, которое имеет его получатели и сеттеры. –

+0

Спасибо, это похоже на правильный ответ. Хотя, когда я пытаюсь сохранить область видимости, она не передает никаких значений. Хотя Джобс добавляет правильно. Может быть проблемой с моим классом формы scopeType. Я отредактировал исходный вопрос, чтобы он был доступен сейчас. – user3248331

Смежные вопросы