通过关系找到了一个新的实体——Symfony 4



我在通过表单持久化一个实体时遇到问题。

我的场景是:

在我的索引页面中,我有一个使用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()]);
}

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

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

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 'AppEntityProduto#empresa' that was not configured to cascade persist operations for entity: 
AppEntityEmpresa@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=persistent的情况。我所要做的就是将外键保存在我试图使用保存在会话变量中的对象id持久化的实体中。

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

Argument 1 passed to AppEntityProduto::setEmpresa() must be an instance of AppEntityEmpresa or null, integer given

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

(注意:条令关系是实体对实体的关系( 因此,当您将变量$empresa分配给produto 时,它应该是一个对象(实体(

$produto->setEmpresa($empresa); //$empressa should be AppEntityEmpresa object

但实际上,您在会话中保存了empresaId,这应该不起作用。

你能做的就是

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()]
)
);

}

最新更新