我正在使用Fos_rest做一個web服務。 我從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*/
}
}
做沖洗時的問題給出的,因爲它承認,因爲「商標」和「類型」爲新的實體,這些已經存在擁有時一個「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,
));
}
}
我通過在「Persist」之前添加以下幾行來解決它: $ entity-> setTrademark($ em-> find(Trademark :: class ,$ entity-> getTrademark() - > getId())); (類型::類,$實體 - > getType() - > getId())); $實體 - > setType($ em-> find – Niko
你不應該做一個查找:它做一個數據庫請求。首選'$ em-> getReference(Type :: class,$ entity-> getType() - > getId())' – goto
這就是我正在尋找的。謝謝! – Niko