我使用Fos_rest进行网络服务。 我从JSON的Angular App中获取了一个实体。 JSON示例:
{"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时会出现问题,因为它识别" trademark"和"键入"作为新实体,因为这些实体在拥有" id"时已经存在。 如何强制实体经理识别实体" trademark"和"键入"从数据库?
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 :(得分:0)
您不应该执行find()
:它会执行数据库请求。喜欢:
$em->getReference(Type::class, $entity->getType()->getId())
它不是数据库查询。唯一的问题是getReference
不检查实体是否仍存在于数据库中。对我来说getReference
只应该用于将id转换为doctrine代理对象