Doctrine 告诉我 "new Entity was found" 当我设置关系 ManyToOne 但不是

Doctrine Tell me "new Entity was found" when i set a relationship ManyToOne but is not

  1. 我有一个 Symfony 项目
  2. 为 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';
     }
    }
    
  3. 这个实体有关系。 (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;
    
  4. 实体 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');
     }
    ...
  1. 当我去保存新的 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 上做错了什么。