2016-12-16 3 views
1

Я использую Fos_rest, чтобы сделать веб-сервис. Я получаю сущность из Углового приложения в JSON. JSON пример:Как заставить сущность-менеджер symfony распознавать существующие сущности?

{"model": 
    { 
    "trademark": 
     {"id":1,"name":"Alfa Romeo"}, 
    "type": 
     {"id":1,"code":"car","name":"Car"}, 
    "name":"147" 
    } 
} 

Объект состоит из двух подгрупп лиц, называется «товарный знак» и «тип».

При получении POST, контроллер выполняет следующие функции:

public function cpostAction(Request $request, $idTrademark) 
    { 
     $entity = new Model(); 
     $form = $this->createForm(ModeloType::class, $entity); 
     $form->handleRequest($request); 
     if ($form->isValid()) { 
      $entity = $form->getData(); 
      $em = $this->getDoctrine()->getManager(); 
      $em->persist($entity); 
      $em->flush(); 

      /*do things with the entity and return*/ 
     } 
    } 

Проблемы даются при выполнении Flush, так как он признает «товарный знак» и «типа» в качестве новых объектов, так как они уже существуют, когда владеющие «id». Как заставить администратор сущности распознать сущности «товарный знак» и «тип» из базы данных?

P.S: Форма Тип:

class ModelType extends AbstractType 
{ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder->add('name') 
       ->add('trademark', TrademarkType::class) 
       ->add('type', TypeType::class) 
       ->add('id'); 
    } 

    public function configureOptions(OptionsResolver $resolver) 
    { 
     $resolver->setDefaults(array(
      'data_class' => 'AppBundle\Entity\Model', 
      'csrf_protection' => false, 
      'allow_extra_fields' => true, 
     )); 
    } 
} 
+0

Я решил его, добавив следующие строки перед «Персист»: $ entity-> setTrademark ($ em-> find (Trademark :: class , $ entity-> getTrademark() -> getId())); $ entity-> setType ($ em-> find (Тип :: класс, $ entity-> getType() -> getId())); – Niko

+0

Вам не нужно делать поиск: он выполняет запрос базы данных. Предпочитаю '$ em-> getReference (Type :: class, $ entity-> getType() -> getId())' – goto

+0

Это именно то, что я ищу. Благодаря! – Niko

ответ

0

Вы не должны делать find(): он делает запрос к базе данных. Предпочтение:

$em->getReference(Type::class, $entity->getType()->getId()) 

Это не запрос к базе данных. Единственная проблема: getReference не проверяет, существует ли сущность в базе данных. Для меня getReference следует использовать только для преобразования id в объект прокси-объекта доктрины

+0

Нет проблем, поскольку выполняется '$ em-> persist ($ entity); $ em-> flush(); 'Если сущности не существуют, генерирует исключение. Спасибо за ответ! – Niko

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