我怎样才能强制 symfony 实体管理器识别现有的子实体?
How can I force the symfony entity-manager to recognize existing sub-entities?
我正在使用 Fos_rest 做一个网络服务。
我从 JSON 中的 Angular 应用程序接收到一个实体。
JSON 示例:
{"model":
{
"trademark":
{"id":1,"name":"Alfa Romeo"},
"type":
{"id":1,"code":"car","name":"Car"},
"name":"147"
}
}
该实体由两个子实体组成,称为 "trademark" 和 "type"。
收到 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" 和 "type" 识别为新实体,因为在拥有 "id" 时它们已经存在。
如何强制实体管理器从数据库中识别实体 "trademark" 和 "type"?
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,
));
}
}
您不应该执行 find()
:它执行数据库请求。偏好:
$em->getReference(Type::class, $entity->getType()->getId())
它不是数据库查询。唯一的问题是 getReference
不检查实体是否仍然存在于数据库中。对我来说 getReference
应该只用于将 id 转换为 doctrine 代理对象
我正在使用 Fos_rest 做一个网络服务。 我从 JSON 中的 Angular 应用程序接收到一个实体。 JSON 示例:
{"model":
{
"trademark":
{"id":1,"name":"Alfa Romeo"},
"type":
{"id":1,"code":"car","name":"Car"},
"name":"147"
}
}
该实体由两个子实体组成,称为 "trademark" 和 "type"。
收到 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" 和 "type" 识别为新实体,因为在拥有 "id" 时它们已经存在。 如何强制实体管理器从数据库中识别实体 "trademark" 和 "type"?
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,
));
}
}
您不应该执行 find()
:它执行数据库请求。偏好:
$em->getReference(Type::class, $entity->getType()->getId())
它不是数据库查询。唯一的问题是 getReference
不检查实体是否仍然存在于数据库中。对我来说 getReference
应该只用于将 id 转换为 doctrine 代理对象