代码之家  ›  专栏  ›  技术社区  ›  Joao Victor Souza

通过这种关系发现了一个新的实体-Symfony 4

  •  0
  • Joao Victor Souza  · 技术社区  · 6 年前

    我无法通过表单持久化一个实体。

    我的设想是:

    在索引页中,我有一个简单的表单,它使用EntityType检索实体。此表单没有数据类,我使用它只是为了保存包含此实体的会话变量,我希望它可以通过应用程序插入到表单中。 这是完整的控制器:

    class HomeController extends Controller{
    
    /**
    * @Route("/", name="index")
    */
    public function index(Request $request) {
        $session = $this->get('session');
        dump($session->get('empresa'));
    
        $usuario = $this->getUser();
    
        $empresas = $usuario->getEmpresas();
    
        $form = $this->createFormBuilder()
            ->add('empresa', EntityType::class, [
                    'class' => Empresa::class,
                    'choice_label' => 'razaoSocial',
                    'choice_value' => 'id',
                    'label' => 'Empresa:',
                    'choices' => $usuario->getEmpresas()
                ])
            ->add('selecionar', SubmitType::class, ['label' => 'Selecionar'])
            ->getForm();
    
        $form->handleRequest($request);
    
        if ($form->isSubmitted() && $form->isValid()) {
            $data = $form->getData();
            $session->set('empresa', $data['empresa']);
            return $this->redirectToRoute('index');
        }
    
        return $this->render('home/index.html.twig', ['form' => $form->createView()]);
    }
    

    它按预期工作,当页面重新加载时,所有数据都会显示在转储中。

    现在在另一个控制器中,我有一个表单,它保存了一个与我保存在转储中的实体相关的实体(它是一个单体关系)。

    public function cadastrarRapido(Request $request){
    
        $usuario = $this->getUser();
    
        $session = $this->get('session');
        dump($session->get('empresa'));
    
        $produto = new Produto();
    
        $form = $this->formFactory->create(ProdutoRapidoType::class, $produto);
        $form->add('cadastrar', SubmitType::class, ['label' => 'Cadastrar']);
        $form->handleRequest($request);
    
        if ($form->isSubmitted() && $form->isValid()){
            $produto = $form->getData();
            $empresa = $session->get('empresa');
            $produto->setEmpresa($empresa);
            $this->entityManager->persist($produto);
            $this->entityManager->flush();
    
            $this->flashBag->add('success', 'Produto adicionado!');
    
            return new RedirectResponse($this->router->generate('cadastro_produto_rapido'));
        }
    
        return new Response(
            $this->twig->render(
                'produto/cadastro-rapido.html.twig',
                ['form' => $form->createView()]
        )
        );
    }
    

    所以,当我试图提交这个表单时,我得到了以下错误

    A new entity was found through the relationship 'App\Entity\Produto#empresa' that was not configured to cascade persist operations for entity: 
    App\Entity\Empresa@000000006e7adf9a000000004feede5f. 
    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"}). 
    

    我没有试图更新我的其他实体,因此这不是使用cascade=persist的情况。 我要做的就是将外键保存在我试图持久化的实体中,对象id保存在我的会话变量中。

    我是否以正确的方式在会话变量中捕获对象?如果我用 $session->set('empresa', $data['empresa']->getId()); 提交表单时出现此错误

    Argument 1 passed to App\Entity\Produto::setEmpresa() must be an instance of App\Entity\Empresa or null, integer given
    

    我想我要做的是一些简单的事情,但我不知道这是不是正确的方法。谢谢你的帮助

    1 回复  |  直到 6 年前
        1
  •  0
  •   Theva    6 年前

    (注:原则关系为实体对实体) 因此变量 $empresa公司 应该是一个对象(实体),当您将其分配给produto时

    $produto->setEmpresa($empresa); //$empressa should be App\Entity\Empresa object
    

    但你马上就救了 经营方案 在会议上,这不应该起作用。

    你能做的就是,

    public function cadastrarRapido(Request $request){
    
        $usuario = $this->getUser();
    
        $session = $this->get('session');
    
        $empresaId = $session->get('empresa');
        $repository = $this->getDoctrine()->getRepository(Empresa::class);
    
        // look for a single Empresa by its primary key (usually "id")
        $empresa = = $repository->find($id);
    
        $produto = new Produto();
    
        $form = $this->formFactory->create(ProdutoRapidoType::class, $produto);
        $form->add('cadastrar', SubmitType::class, ['label' => 'Cadastrar']);
        $form->handleRequest($request);
    
        if ($form->isSubmitted() && $form->isValid()) {
            $produto = $form->getData();
            $empresa = $session->get('empresa'); // now this embpresa is an object
            $produto->setEmpresa($empresa);
            $this->entityManager->persist($produto);
            $this->entityManager->flush();
    
            $this->flashBag->add('success', 'Produto adicionado!');
    
            return new RedirectResponse($this->router->generate('cadastro_produto_rapido'));
        }
    
        return new Response(
            $this->twig->render(
                'produto/cadastro-rapido.html.twig',
                ['form' => $form->createView()]
            )
        );
    

    }