Я использую 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,
));
}
}
Я решил его, добавив следующие строки перед «Персист»: $ entity-> setTrademark ($ em-> find (Trademark :: class , $ entity-> getTrademark() -> getId())); $ entity-> setType ($ em-> find (Тип :: класс, $ entity-> getType() -> getId())); – Niko
Вам не нужно делать поиск: он выполняет запрос базы данных. Предпочитаю '$ em-> getReference (Type :: class, $ entity-> getType() -> getId())' – goto
Это именно то, что я ищу. Благодаря! – Niko