Symfony3误差多对多使用属性

问题描述:

我们必须努力创造这样Symfony3误差多对多使用属性

Llamadas 2个表内的关系,当一个错误 - || - | < - > | - || - PersonaDerivada

我们正试图创建一个只有一个创建形式的“LlamadaDivivada”。

内Llamada实体

<?php 

namespace xxxxBundle\Entity; 

use Doctrine\ORM\Mapping as ORM; 
use Doctrine\Common\Collections\ArrayCollection; 

class Llamada { 

    /** 
    * @var integer 
    * 
    * @ORM\Column(name="id", type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="SEQUENCE") 
    * @ORM\SequenceGenerator(sequenceName="llamada_id_seq", allocationSize=1, initialValue=1) 
    */ 
    private $id; 

    /** 
    * @var string 
    * @Assert\Length(
    *  max = 50, 
    *  maxMessage = "Your first name cannot be longer than {{ limit }} characters", 
    *) 
    * @ORM\Column(name="nombre", type="string", length=150, nullable=false) 
    */ 
    private $nombre; 
    /** 
    * 
    * @ORM\OneToMany(targetEntity="LlamadaDerivado", mappedBy="llamada") 
    */ 
    private $derivados; 

    function __construct() { 
     $this->derivados = new ArrayCollection(); 
    } 

    function getId() { 
     return $this->id; 
    } 

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

    function setId($id) { 
     $this->id = $id; 
    } 

    function setNombre($nombre) { 
     $this->nombre = $nombre; 
    } 

    function getDerivados(){ 
     return $this->derivados; 
    } 
    function setDerivados($derivados){ 
     $this->derivados = $derivados; 
    } 
} 

然后LlamadaDerivado实体里面,我们有这个

<?php 

namespace xxxBundle\Entity; 

use Doctrine\ORM\Mapping as ORM; 

/** 
* LlamadaDerivado 
* 
* @ORM\Table(name="llamada_derivado") 
* @ORM\Entity 
*/ 
class LlamadaDerivado 
{ 

    /** 
    * @var \AgendaBundle\Entity\Llamada 
    * 
    * @ORM\ManyToOne(targetEntity="AgendaBundle\Entity\Llamada",inversedBy="derivados",cascade={"persist"}) 
    * @ORM\Id 
    * @ORM\JoinColumns({ 
    * @ORM\JoinColumn(name="id_llamada", referencedColumnName="id") 
    * }) 
    */ 
    private $llamada; 

    /** 
    * @var \AgendaBundle\Entity\PersonaDerivado 
    * 
    * @ORM\ManyToOne(targetEntity="AgendaBundle\Entity\PersonaDerivado",inversedBy="llamadas",cascade={"persist"}) 
    * @ORM\Id 
    * @ORM\JoinColumns({ 
    * @ORM\JoinColumn(name="id_derivado", referencedColumnName="id") 
    * }) 
    */ 
    private $derivado; 


    /** 
    * @var DateTime 
    * 
    * @ORM\Column(name="fecha_derivacion", type="date", nullable=false) 
    */ 
    private $fechaDerivacion; 


    function getLlamada(){ 
     return $this->llamada; 
    } 

    function getDerivado(){ 
     return $this->derivado; 
    } 

    function getFechaDerivacion() { 
     return $this->fechaDerivacion; 
    } 

    function setLlamada($llamada) { 
     $this->llamada = $llamada; 
    } 

    function setDerivado($derivado) { 
     $this->derivado = $derivado; 
    } 

    function setFechaDerivacion($fechaDerivacion) { 
     $this->fechaDerivacion = $fechaDerivacion; 
    } 

} 

而且PersonaDerivado实体

<?php 

namespace xxxBundle\Entity; 

use Doctrine\ORM\Mapping as ORM; 
use Doctrine\Common\Collections\ArrayCollection; 

/** 
* ReunionLugar 
* 
* @ORM\Table(name="persona_derivado") 
* @ORM\Entity 
*/ 
class PersonaDerivado 
{ 

    public function __construct() { 
     $this->llamadas = new ArrayCollection(); 
    } 
    /** 
    * @var integer 
    * 
    * @ORM\Column(name="id", type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="SEQUENCE") 
    * @ORM\SequenceGenerator(sequenceName="reunion_lugar_id_seq", allocationSize=1, initialValue=1) 
    */ 
    private $id; 

    /** 
    * @var string 
    * 
    * @ORM\Column(name="nombre", type="string", length=150, nullable=false) 
    */ 
    private $nombre; 

    /** 
    * @ORM\OneToMany(targetEntity="LlamadaDerivado", mappedBy="derivado") 
    */ 
    private $llamadas; 

    function getId() { 
     return $this->id; 
    } 

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

    function setId($id) { 
     $this->id = $id; 
    } 

    function setNombre($nombre) { 
     $this->nombre = $nombre; 
    } 

    function setLlamadas($llamadas) { 
     $this->llamadas = $llamadas; 
    } 

} 

而且LlamadaType里面

class LlamadaDto extends AbstractType { 

    public function buildForm(FormBuilderInterface $builder, array $options) { 
     $disabled = $options['disabled']; 


     $builder 
       ->add('id', HiddenType::class) 
       ->add('nombre', TextType::class, array(
        'disabled' => $disabled, 
        'attr' => ['maxlength'=>'50'] 
       ))->add('apellido', TextType::class, array(
        'disabled' => $disabled, 
        'attr' => ['maxlength'=>'50'] 
       ))->add('fecha', DateType::class, array(
        'format' => 'dd/MM/yyyy', 
        'disabled' => $disabled, 
        'widget' => 'single_text', 
        'attr' => ['class' => 'datepicker'] 
       ))->add('hora', TimeType::class, array(
        'disabled' => $disabled 
       ))->add('motivo', TextareaType::class, array(
        'disabled' => $disabled, 
        'attr' => ['maxlength'=>'400'] 
       ))->add('telefonoContacto', TextType::class, array(
        'disabled' => $disabled, 
        'attr' => ['maxlength'=>'9'] 
       ))->add('derivados', EntityType::class, array(
        'class' => 'AgendaBundle:PersonaDerivado', 
        'choice_label' => 'apellidoNombre', 
        'placeholder' => 'Seleccionar un derivado', 
        'multiple' => true, 
       )); 
    } 

    public function configureOptions(OptionsResolver$resolver) { 
     $resolver->setDefaults(array('data_class' => Llamada::class)); 
    } 

} 

我们有这样的代码

<?php 

/** 
    * @Route("/Llamada/save",name="saveLlamada") 
    */ 
    public function saveLlamadaAction(Request $request) { 
     $llamadaService = $this->get('llamadaService'); 
     $derivadoService = $this->get('derivadoService'); 

     $form = $this->createForm(LlamadaDto::class); 
     $form->handleRequest($request); 

     $editar = TRUE; 
     $llamada = $form->getData(); 

     $derivados = $request->request->get("llamada_dto")["derivados"]; 


     $derivadosActuales = $derivadoService->getLlamadaDerivados($llamada->getId()); 

     foreach ($derivados as $key1 => $d) { 
      foreach ($derivadosActuales as $key2 => $da) { 
       if($da->getDerivado()->getId()==$d){ 
        array_splice($derivados, array_search($d, $derivados),1); 
       } 
      } 
     } 

     if ($llamadaService->saveLlamada($llamada)) { 
      $this->addFlash(
        'exitoLlamada', 'Datos de llamada guardados exitosamente' 
      ); 

      $derivadoService->saveDerivados($derivados,$llamada); 
     } else { 
      $this->addFlash(
        'errorLlamada', 'Disculpe, hubo un error en el registro de la llamada' 
      ); 
     } 
     return new RedirectResponse($this->generateUrl('listaLlamadas', array(), UrlGeneratorInterface::RELATIVE_PATH)); 
    } 

控制器并称为服务里面是这样的:

public function saveLlamada($llamada){ 
    try{ 
    if($llamada->getId()){ 
     $this->em->merge($llamada); 
    }else{ 
     $this->em->persist($llamada); 
    } 

    $this->em->flush(); 
    return TRUE; 
    } catch (Exception $ex){ 
     return FALSE; 
    } 
} 

public function saveDerivados($derivados,$llamada){ 
    foreach ($derivados as $key => $derivado) { 
     $llamadaDerivado = new LlamadaDerivado(); 
     $personaLlamada = $this->getDerivado($derivado); 

     $llamadaDerivado->setLlamada($llamada); 
     $llamadaDerivado->setDerivado($personaLlamada); 
     $llamadaDerivado->setFechaDerivacion(new \DateTime('now', (new \DateTimeZone('America/Argentina/Ushuaia')))); 
     $this->em->persist($llamadaDerivado); 
     $this->em->flush(); 
    } 
} 

这是我们得到的错误:

捕获的PHP Exception Doctrine \ ORM \ ORMInvalidArgumentException:“关联字段”xxxBun“的类型”Doctrine \ Common \ Collections \ Collection | array“的期望值dle \ Entity \ Llamada#$ derivados“,改为”xxxBundle \ Entity \ PersonaDerivado“。” at project \ vendor \ doctrine \ orm \ lib \ Doctrine \ ORM \ ORMInvalidArgumentException.php line 206

我们已经使用了1周了。 提前感谢

看看Llamada实体,$ DERIVADOS是LlamadaDerivado阵列收集和你LlamadaType你把它AgendaBundle的的EntityType:PersonaDerivado,这就是为什么你得到这个错误。可以考虑使用集合类型来每次添加所有对象LlamadaDerivado以便尊重映射。

+0

感谢您的回答。我试图做到这一点,但问题是,当我这样做时,只加载我在关系中的实体,并且我需要选项列表显示所有可用“personaDerivada”。 –

你可以尝试使用CollectionType代替的EntityType在formtype,虽然我有一块在我面前代码工​​作得很好用的EntityType和multiple标志一个一对多的关系。

+0

感谢您的回答。我试图做到这一点,但问题是,当我这样做时,只加载我在关系中的实体,并且我需要选项列表显示所有可用“personaDerivada”。 –