Doctrine 告诉我 "new Entity was found" 当我设置关系 ManyToOne 但不是
Doctrine Tell me "new Entity was found" when i set a relationship ManyToOne but is not
- 我有一个 Symfony 项目
为 ner 实体创建一个表单。
class EquipoType extends AbstractType{
/**
* {@inheritdoc}
*/
public function buildForm(FormBuilderInterface $builder, array $options)
{
$equipo = new Equipo();
$builder
->add('unidades', IntegerType::class)
->add('accionComercial', EntityType::class, array(
'class' => 'AppBundle\Entity\IndicoGpt\adelantoequipos\AccionComercial',
'em' => 'adeq',
'choices' => $equipo->getAccionComercial(),
'choice_label' => 'nombre',
'placeholder' => 'Elija Accion Comercial'
))
->add('modelo', TextType::class)
->add('save', SubmitType::class, array(
'label' => 'Guardar Equipo',
'attr' => array(
'class' => "btn btn-info",
'style' => "margin-top: 7px; margin-left:40%;"
))
);
$builder->get('modelo')
->addModelTransformer(new CallbackTransformer(
function ($modelo) {
return $modelo ? $modelo->getModDescModelo() : $modelo;
},
function ($modelo) use ($options) {
return $modelo ? $options['em']->getRepository(ModModelo::class)->findOneBy(array(
'modDescModelo' => $modelo
)) : $modelo;
}
));
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'AppBundle\Entity\IndicoGpt\adelantoequipos\Equipo',
'em' => "adeq"
));
}
/**
* {@inheritdoc}
*/
public function getBlockPrefix()
{
return 'appbundle_indicogpt_adelantoequipos_equipo';
}
}
这个实体有关系。
(Equipo 有 Modelo[oneToMany], Modelo 有 Many Equipos[oneToMany])
class Equipo
{
/**
* @var \AppBundle\Entity\IndicoGpt\catalogo\ModModelo
*
* @ORM\ManyToOne(targetEntity="AppBundle\Entity\IndicoGpt\catalogo\ModModelo")
* @ORM\JoinColumns({
* @ORM\JoinColumn(name="modelo_id", referencedColumnName="MOD_ID_MODELO")
* })
*/
private $modelo;
实体 Modelo 充满了装备模型类型的行(以 db 为单位)。因此 Equipo 只需要保存 Modelo 行的现有 ID。
当我这样做时出现问题$emAedq->flush()
这是我的控制器:
public function crearEquipo(Request $request){
$emAdeq = $this->getDoctrine()->getManager('adeq');
$emCatalogo = $this->getDoctrine()->getManager('catalogo');
$equipo = new Equipo();
$form = $this->createForm(EquipoType::class, $equipo, array(
'action' => "crearEquipo",
'em' => $emCatalogo,
'attr' => array(
'class' => "form"
)
));
$form->handleRequest($request);
if ($form->isSubmitted()) {
$equipo = $form->getData();
$emAdeq->persist($equipo);
$emAdeq->flush();
$this->addFlash('exito', $equipo->getId());
return $this->redirectToRoute('portadaAdelantoEquipos');
}
...
- 当我去保存新的 Equipo 时,它告诉我在关系中找到了一个新实体,应该保存(参考 Modelo 关联),但是那个实体不是新的,它是现有的 Modelo,现在与 Equipo 相关。
如图所示,我通过自动完成字段选择了现有的 Modelo。
就在执行实体的 $emAdeq->persist($equipo)
之前,我可以在调试器中看到我要保存的对象看起来结构良好:
错误是下一个:
A new entity was found through the relationship 'AppBundle\Entity\IndicoGpt\adelantoequipos\Equipo#modelo' that was not configured to cascade persist operations for entity: AppBundle\Entity\IndicoGpt\catalogo\ModModelo@0000000011088ca600000000661c7dca. To solve this issue: Either explicitly call EntityManager#persist() on this unknown entity or configure cascade persist this association in the mapping for example @ManyToOne(..,cascade={"persist"}). If you cannot find out which entity causes the problem implement 'AppBundle\Entity\IndicoGpt\catalogo\ModModelo#__toString()' to get a clue.
我不明白为什么认为这是一个新的实体,为什么给我这个引用 modelo 的字符串:
为什么会这样?
我怎样才能挽救 Equipo 和他的关系?
没有坚持 Modelo 因为我无法保存已经存在的 Modelo!
我看过其他例子。但这对我不起作用...
我运行这个命令php bin/console doctrine:schema:validate
一切正常。
您可以将 cascade persist
配置到您的实体中,或者您可以更改它:
$emAdeq->persist($equipo);
对此:
$emAdeq->merge($equipo);
问题是我使用了两个 entityManager,因为关系是在 两个 个不同的数据库中建立的。
但是我没有意识到相关实体已经建立了他的数据库,所以我只需要一个个EntityManager.
有了一个entityManager我可以在没有其他EntityManager
的情况下请求一个实体和关系
由于有两个 entityManagers,我被要求保存两次。
解法:
在实体中建立他的数据库:* @ ORM \ Table (name = "advanced equipment.")
在我使用 $emCatalgo 的地方用 $emAdeq 替换它并删除目录,因为它不可用。
感谢 ,因为他的回答也是有效的,但这让我意识到我在 2 个 EntittyManagers 上做错了什么。
- 我有一个 Symfony 项目
为 ner 实体创建一个表单。
class EquipoType extends AbstractType{ /** * {@inheritdoc} */ public function buildForm(FormBuilderInterface $builder, array $options) { $equipo = new Equipo(); $builder ->add('unidades', IntegerType::class) ->add('accionComercial', EntityType::class, array( 'class' => 'AppBundle\Entity\IndicoGpt\adelantoequipos\AccionComercial', 'em' => 'adeq', 'choices' => $equipo->getAccionComercial(), 'choice_label' => 'nombre', 'placeholder' => 'Elija Accion Comercial' )) ->add('modelo', TextType::class) ->add('save', SubmitType::class, array( 'label' => 'Guardar Equipo', 'attr' => array( 'class' => "btn btn-info", 'style' => "margin-top: 7px; margin-left:40%;" )) ); $builder->get('modelo') ->addModelTransformer(new CallbackTransformer( function ($modelo) { return $modelo ? $modelo->getModDescModelo() : $modelo; }, function ($modelo) use ($options) { return $modelo ? $options['em']->getRepository(ModModelo::class)->findOneBy(array( 'modDescModelo' => $modelo )) : $modelo; } )); public function configureOptions(OptionsResolver $resolver) { $resolver->setDefaults(array( 'data_class' => 'AppBundle\Entity\IndicoGpt\adelantoequipos\Equipo', 'em' => "adeq" )); } /** * {@inheritdoc} */ public function getBlockPrefix() { return 'appbundle_indicogpt_adelantoequipos_equipo'; } }
这个实体有关系。 (Equipo 有 Modelo[oneToMany], Modelo 有 Many Equipos[oneToMany])
class Equipo { /** * @var \AppBundle\Entity\IndicoGpt\catalogo\ModModelo * * @ORM\ManyToOne(targetEntity="AppBundle\Entity\IndicoGpt\catalogo\ModModelo") * @ORM\JoinColumns({ * @ORM\JoinColumn(name="modelo_id", referencedColumnName="MOD_ID_MODELO") * }) */ private $modelo;
实体 Modelo 充满了装备模型类型的行(以 db 为单位)。因此 Equipo 只需要保存 Modelo 行的现有 ID。
当我这样做时出现问题$emAedq->flush()
这是我的控制器:
public function crearEquipo(Request $request){
$emAdeq = $this->getDoctrine()->getManager('adeq');
$emCatalogo = $this->getDoctrine()->getManager('catalogo');
$equipo = new Equipo();
$form = $this->createForm(EquipoType::class, $equipo, array(
'action' => "crearEquipo",
'em' => $emCatalogo,
'attr' => array(
'class' => "form"
)
));
$form->handleRequest($request);
if ($form->isSubmitted()) {
$equipo = $form->getData();
$emAdeq->persist($equipo);
$emAdeq->flush();
$this->addFlash('exito', $equipo->getId());
return $this->redirectToRoute('portadaAdelantoEquipos');
}
...
- 当我去保存新的 Equipo 时,它告诉我在关系中找到了一个新实体,应该保存(参考 Modelo 关联),但是那个实体不是新的,它是现有的 Modelo,现在与 Equipo 相关。
如图所示,我通过自动完成字段选择了现有的 Modelo。
就在执行实体的 $emAdeq->persist($equipo)
之前,我可以在调试器中看到我要保存的对象看起来结构良好:
错误是下一个:
A new entity was found through the relationship 'AppBundle\Entity\IndicoGpt\adelantoequipos\Equipo#modelo' that was not configured to cascade persist operations for entity: AppBundle\Entity\IndicoGpt\catalogo\ModModelo@0000000011088ca600000000661c7dca. To solve this issue: Either explicitly call EntityManager#persist() on this unknown entity or configure cascade persist this association in the mapping for example @ManyToOne(..,cascade={"persist"}). If you cannot find out which entity causes the problem implement 'AppBundle\Entity\IndicoGpt\catalogo\ModModelo#__toString()' to get a clue.
我不明白为什么认为这是一个新的实体,为什么给我这个引用 modelo 的字符串:
为什么会这样? 我怎样才能挽救 Equipo 和他的关系? 没有坚持 Modelo 因为我无法保存已经存在的 Modelo!
我看过其他例子
我运行这个命令php bin/console doctrine:schema:validate
一切正常。
您可以将 cascade persist
配置到您的实体中,或者您可以更改它:
$emAdeq->persist($equipo);
对此:
$emAdeq->merge($equipo);
问题是我使用了两个 entityManager,因为关系是在 两个 个不同的数据库中建立的。
但是我没有意识到相关实体已经建立了他的数据库,所以我只需要一个个EntityManager.
有了一个entityManager我可以在没有其他EntityManager
的情况下请求一个实体和关系由于有两个 entityManagers,我被要求保存两次。
解法:
在实体中建立他的数据库:* @ ORM \ Table (name = "advanced equipment.")
在我使用 $emCatalgo 的地方用 $emAdeq 替换它并删除目录,因为它不可用。
感谢