如何处理表单中的多元关系

时间:2014-11-03 05:18:16

标签: php forms symfony many-to-one

我试图从已购买的各种产品中保护连续出版物,所以我在发票表,序列表和我的产品表之间建立了关系,关系如下所示。

tables

我已经做了一个表单来添加product_table和invoice_table与serial_table之间的关系,表单是添加关系和连续出版物,但是用户不应该可以选择表之间的关系,它应该找到购买的idproduct和id发票制作并存储连续出版物并将其发送到数据库而无需用户更改,下面是我的表格图片。

form

这是上面表格中的表格类型

class serialType extends AbstractType
{
        /**
     * @param FormBuilderInterface $builder
     * @param array $options
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
           ->add('serial','integer')
           ->add('idPedido')
           ->add('idProducto')         
           ->add('agregar serial','submit')
        ;
    }

    /**
     * @param OptionsResolverInterface $resolver
     */
    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
           'data_class' => 'sava\InventarioBundle\Entity\TblProductosSeriales'
          // 'inherit_data' => true
        ));
    }

    /**
     * @return string
     */
    public function getName()
    {
        return 'sava_inventariobundle_serial';
    }
}

我使用上面显示的表中的php app/console doctrine:mapping:import命令导入了我的orm文件。

这是我的产品。

sava\InventarioBundle\Entity\TblProductos:
    type: entity
    table: tbl_productos
    fields:
        idProduct:
            id: true
            type: integer
            unsigned: false
            nullable: false
            column: id_product
            generator:
                strategy: IDENTITY
    lifecycleCallbacks: {

}

我的序列密钥表orm。

sava\InventarioBundle\Entity\TblProductosSeriales:
    type: entity
    table: tbl_productos_seriales
    fields:
        idProductoSerial:
            id: true
            type: integer
            unsigned: false
            nullable: false
            column: id_producto_serial
            generator:
                strategy: IDENTITY
        serial:
            type: string
            length: 80
            fixed: false
            nullable: false
    manyToOne:
        idProduct:
            targetEntity: TblProductos
            cascade: {  }
            mappedBy: null
            inversedBy: null
            joinColumns:
                id_product:
                    referencedColumnName: id_product
            orphanRemoval: false
        idinvoice:
            targetEntity: TblPedidos
            cascade: {  }
            mappedBy: null
            inversedBy: null
            joinColumns:
                id_pedido:
                    referencedColumnName: id_invoice
            orphanRemoval: false
    lifecycleCallbacks: {  }

这是我的发票orm。

sava\InventarioBundle\Entity\TblPedidos:
    type: entity
    table: tbl_pedidos
    fields:
        idinvoice:
            id: true
            type: integer
            unsigned: false
            nullable: false
            column: id_invoice
            generator:
                strategy: IDENTITY
    lifecycleCallbacks: {  }

1 个答案:

答案 0 :(得分:1)

如果您不希望用户能够选择关系,为什么要将它们添加到表单中?您可以在控制器中设置它们的服务器端:

所以:

  1. 获取表单数据
  2. 使用表单中的id查询数据库以获取另外两个
  3. 水合对象(formObject-> setStuff($ id))
  4. 持续
  5. 让您知道该怎么做:例如,如果您有一个序列号,并希望从中获取您的产品ID

      $serial = new Serial;
      $form = $this->createForm(new SerialType, $serial);  
    
      $request = $this->get('request');
    
    
      if ($request->getMethod() == 'POST') {
    
        $form->bind($request);
        // if form is valid
        if ($form->isValid()) {
    
            $em = $this->getDoctrine()->getManager();
    
            // get the data sent from your form
            $data = $form->getData();
            $idSerial = $data->getSerial();
    
    
            // find your ids according to the serial you just got from the form
            $repository = $this->getDoctrine()->getManager()->getRepository('AcmeBundleBundle:Products'); 
            $idProduct = $repository->findBySerial($idSerial); 
    
            // hydrate the $serial
            $serial->setProduct($idProduct);
    
    
            $em->persist($serial);
            $em->flush();
    
            return ....
          }
      }
    

    如果你的模板中有id,那么

    <form role="form" 
              action="{{ path('your_route', { 'idProduct': idProduct, 'idInvoice': idInvoice }) }}"
              ...
        </form>
    

    然后你就可以像控件那样把它们放在你的控制器中

    UpdateSerialAction($idProduct, $idInvoice)
    {
    

    并使用这两个参数

    水合表单对象