我有两种形式(插入控制器中),它们依赖于关系为 1:n 的两个实体。
第一个(订单)将一些数据(POST)发送到第二个(Orders_detail);我的目的是为一个提供商创建购买,因此在第一种形式中,我必须选择一个供应商,该供应商将我带到第二种形式,从中选择一种产品。
当我坚持到数据库时,除了id_provider之外,所有数据都保留下来,我不明白为什么,因为它是通过 POST 发送的。
我尝试从 $ 形式和其他方式访问它,但它会引发错误,因为它需要成为 Proveedores 的实例(另一个依赖于的实体)。您可以在此处查看关系架构 https://1drv.ms/f/s!Av9T-u6UurJJ5Gu1cLoLiIHGLbDm
控制器
public function new2Action(Request $request)
{
$pedidos= new Pedidos();
$form=$this->createFormBuilder($pedidos)
->setAction($this->generateUrl('pedidosDetalle_new2'))
->setMethod('POST')
->add('idProveedor')
->add('id', HiddenType::class)
->getForm();
return $this->render('ComprasBundle:pedidos:new2.html.twig', array(
'form'=>$form->createView(),
));
}
public function detallesNew2Action(Request $request, $id)
{
$pedidosDetalle= new Pedidos_detalle();
$pedidos=new Pedidos();
$form=$this->createFormBuilder($pedidosDetalle)
->setAction($this->generateUrl('pedidosDetalle_new2'))
->setMethod('POST')
->add('seleccionarProducto','checkbox', array(
'mapped'=>false))
->add('idProducto')
->add('cantidadPedida')
->add('observaciones')
->add('idPedido', HiddenType::class)
->getForm();
$form->handleRequest($request);
$em=$this->getDoctrine()->getManager();
if ($form->isValid()){
//
$pedidos->setFechaPedido(new DateTime('now'));
$pedidos->setFechaEntregaPrevista(new DateTime('now'));
$pedidos->setResponsableCompra($this->getUser());
$pedidos->setEntregado(false);
$pedidos->setIdProveedor($pedidos->getIdProveedor()); THIS DONT WORK (Catchable Fatal Error: Argument 1 passed to CocinaComprasBundleEntityPedidos::setIdProveedor() must be an instance of CocinaComprasBundleEntityProveedores, null given, called in C:xampphtdocsCocinasrcCocinaComprasBundleControllerPedidosController.php on line 225 and defined)
$em->persist($pedidos);
$em->persist($pedidosDetalle);
$em->flush();
$flashBag = $this->get('session')->getFlashBag();
$flashBag->add('success', 'Pedido guardado');
}
$fechaEntrega=$request->get('fechaEntrega');
$fechaPedido=$request->get('fechaPedido');
return $this->render('ComprasBundle:pedidos:Detallesnew2.html.twig', array(
'form'=>$form->createView(),
'fechaEntrega'=>$fechaEntrega,
'fechaPedido'=>$fechaPedido
));
}
实体佩迪多斯
class Pedidos
{
/**
* @var int
*
* @ORMColumn(name="id", type="integer")
* @ORMId
* @ORMGeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @ORMManyToOne(targetEntity="CocinaComprasBundleEntityProveedores")
*/
private $idProveedor;
...
/**
* Set idProveedor
*/
public function setIdProveedor(CocinaComprasBundleEntityProveedores $idProveedor)
{
$this->idProveedor = $idProveedor;
return $this;
}
/**
* Get idProveedor
*
* @return string
*/
public function getIdProveedor()
{
return $this->idProveedor;
}
...
public function __toString(){
return $this->id;
}
实体PEDIDOS_DETALLE
class Pedidos_detalle
{
/**
* @var int
*
* @ORMColumn(name="id", type="integer")
* @ORMId
* @ORMGeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @ORMManyToOne(targetEntity="CocinaComprasBundleEntityPedidos")
*/
private $idPedido;
/**
* @ORMManyToOne(targetEntity="CocinaComprasBundleEntityProductos")
*/
.......
/**
* Set idPedido
*/
public function setIdPedido(CocinaComprasBundleEntityPedidos $idPedido)
{
$this->idPedido = $idPedido;
}
/**
* Get idPedido
*
* @return string
*/
public function getIdPedido()
{
return $this->idPedido;
}
.....
public function __toString(){
return $this->id;
}
我希望我正确理解了你的问题。所以我认为在我看来,您只需要使用一种形式并设置与另一种表单(集合)的关系,并将该表单作为子表单使用。
对于此解决方案,您可以在第一个窗体中使用CollectionType
并引用另一个窗体。
https://symfony.com/doc/current/form/form_collections.html
然后,您可以同时使用窗体和实体,但只需保留主窗体。然后,当您渲染第一个表单时,也会呈现第二个表单。
使用Boostrap捆绑包中的BootstrapCollection类型,您可以做更多的事情。