0

我有以下正在运行的代码,我发现的唯一问题是当我创建/编辑 acliente并从中附加/删除 aservicio时,而不是链接我现有的 idservicio它创建另一个,我在这里解释。

cliente: foo. id: 1

service: bar. id: 1

我转到表单,选择foo并且 bar,当我提交时,我希望在clientes_servicios处理这些数据的关系的表上:

cliente_id      servicio_id
    1               1

相反,我得到的是:

cliente_id      servicio_id
    1               2

如果我去表servicios,我看到 Symfony2 已经创建了另一个带有名称bar但 id的服务,2而不是使用现有的bar带有 id的服务1

所以我想要的是使用现有的servicio并且永远不会servicio从表单创建新的cliente(因为我有另一个表单只是用于 Servicio)

客户表格

<?php
namespace Pge\IncidenciasBundle\Form;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;

class ClientesType extends AbstractType
{
    /**
     * @param FormBuilderInterface $builder
     * @param array $options
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('nombre')
            ->add('servicio', 'collection', array(
                    'type' => new ServiciosType(),
                    'allow_add' => true,
                    'allow_delete' => true,
                    'prototype' => true,
                    // Post Update
                    'by_reference' => false
        ))
        ;
    }

    /**
     * @param OptionsResolverInterface $resolver
     */
    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'Pge\IncidenciasBundle\Entity\Clientes',
            'csrf_protection' => false,
        ));
    }

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

服务表格

<?php

namespace Pge\IncidenciasBundle\Form;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;

use Doctrine\ORM\EntityRepository;
class ServiciosType extends AbstractType
{
    /**
     * @param FormBuilderInterface $builder
     * @param array $options
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('nombre', 'entity', array(
                    'class' => 'PgeIncidenciasBundle:Servicios'
        ));
    }

    /**
     * @param OptionsResolverInterface $resolver
     */
    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'Pge\IncidenciasBundle\Entity\Servicios'
        ));
    }

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

客户控制器

public function createAction(Request $request)
    {
        $entity  = new Clientes();
        $form = $this->createForm(new ClientesType(), $entity);
        $form->submit($request);

        if ($form->isValid()) {
            $em = $this->getDoctrine()->getManager();
            $em->persist($entity);
            $em->flush();

            return $this->redirect($this->generateUrl('clientes_show', array('id' => $entity->getId())));
        }

        return $this->render('PgeIncidenciasBundle:Clientes:new.html.twig', array(
            'entity' => $entity,
            'form'   => $form->createView(),
        ));
    }

    /**
     * Displays a form to create a new Clientes entity.
     *
     */
    public function newAction()
    {
        $entity = new Clientes();

        $form   = $this->createForm(new ClientesType(), $entity);

        return $this->render('PgeIncidenciasBundle:Clientes:new.html.twig', array(
            'entity' => $entity,
            'form'   => $form->createView(),
        ));
    }

客户 yml

Pge\IncidenciasBundle\Entity\Clientes:
    type: entity
    table: clientes
    id:
      id:
        type: integer
        generator:
          strategy: IDENTITY
    fields:
        nombre:
            type: string
            length: 250
            fixed: false
            nullable: true   
    manyToMany:
        servicio:
            targetEntity: Servicios
            cascade: [persist]
    lifecycleCallbacks: {  }

服务 YML

Pge\IncidenciasBundle\Entity\Servicios:
    type: entity
    table: servicios
    id:
      id:
        type: integer
        generator:
          strategy: IDENTITY
    fields:
        nombre:
            type: string
            length: 250
            fixed: false
            nullable: true
    lifecycleCallbacks: {  }

客户实体

<?php

namespace Pge\IncidenciasBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * Clientes
 */
class Clientes
{
    /**
     * @var integer
     */
    private $id;

    /**
     * @var string
     */
    private $nombre;

    /**
     * @var \Doctrine\Common\Collections\Collection
     */
    private $servicio;

    /**
     * Constructor
     */
    public function __construct()
    {
        $this->servicio = new \Doctrine\Common\Collections\ArrayCollection();
    }

    /**
     * Get id
     *
     * @return integer 
     */
    public function getId()
    {
        return $this->id;
    }

    /**
     * Set nombre
     *
     * @param string $nombre
     * @return Clientes
     */
    public function setNombre($nombre)
    {
        $this->nombre = $nombre;

        return $this;
    }

    /**
     * Get nombre
     *
     * @return string 
     */
    public function getNombre()
    {
        return $this->nombre;
    }

    /**
     * Add servicio
     *
     * @param \Pge\IncidenciasBundle\Entity\Servicios $servicio
     * @return Clientes
     */
    public function addServicio(\Pge\IncidenciasBundle\Entity\Servicios $servicio)
    {
        $this->servicio[] = $servicio;

        return $this;
    }

    /**
     * Remove servicio
     *
     * @param \Pge\IncidenciasBundle\Entity\Servicios $servicio
     */
    public function removeServicio(\Pge\IncidenciasBundle\Entity\Servicios $servicio)
    {
        $this->servicio->removeElement($servicio);
    }

    /**
     * Get servicio
     *
     * @return \Doctrine\Common\Collections\Collection 
     */
    public function getServicio()
    {
        return $this->servicio;
    }

    public function __toString()
    {
        return $this->nombre;
    }
}

服务实体

<?php

namespace Pge\IncidenciasBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * Servicios
 */
class Servicios
{
    /**
     * @var integer
     */
    private $id;

    /**
     * @var string
     */
    private $nombre;


    /**
     * Get id
     *
     * @return integer 
     */
    public function getId()
    {
        return $this->id;
    }

    /**
     * Set nombre
     *
     * @param string $nombre
     * @return Servicios
     */
    public function setNombre($nombre)
    {
        $this->nombre = $nombre;

        return $this;
    }

    /**
     * Get nombre
     *
     * @return string 
     */
    public function getNombre()
    {
        return $this->nombre;
    }

    public function __toString()
    {
        return (string) $this->nombre;
    }
}
4

1 回答 1

2

关键是您正在以一种糟糕的方式构建表单。您的客户类型应该是:

$builder
    ->add('nombre')
    ->add('servicio', 'entity', array(
        'class' => '/service/entity/namespace',
        'multiple' => true,
    ));

给定现有客户或新客户,您将获得多项服务。

一些技巧

  • Symfony2 实体总是单数(Cliente, Servicio)
  • *ToMany 关系变量应该是复数( $servicios, $clientes )
于 2013-08-19T11:04:43.473 回答