Symfony3错误,具有多个属性

Symfony3错误,具有多个属性,symfony,doctrine-orm,many-to-many,symfony-3.3,Symfony,Doctrine Orm,Many To Many,Symfony 3.3,尝试在两个表中创建关系时出错,如下所示 Llamadas-| |-| |-| |-人物 我们正在尝试创建一个只有一个create表单,其中包含“LlamadaDerivada” 拉马达实体内部 <?php namespace xxxxBundle\Entity; use Doctrine\ORM\Mapping as ORM; use Doctrine\Common\Collections\ArrayCollection; class Llamada { /**

尝试在两个表中创建关系时出错,如下所示

Llamadas-| |-| |-| |-人物

我们正在尝试创建一个只有一个create表单,其中包含“LlamadaDerivada”

拉马达实体内部

<?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;
    }
}
在控制器内部,我们有这个代码

<?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));
    }
这是我们得到的错误:

未捕获的PHP异常条令\ORM\ORMInvalidArgumentException:“关联字段”xxxBundle\Entity\Llamada#$derividos的“条令\Common\Collections\Collection\Collection |数组”类型的预期值改为“xxxBundle\Entity\personalderividiando”。在project\vendor\document\ORM\lib\document\ORM\ORM\ORMInvalidArgumentException.PHP第206行

我们已经用了一个星期了。
提前非常感谢

查看Llamada实体,$derividos是LlamadaDerivado的数组集合,在您的LlamadaType中,您将其设置为entityType of AgendaBundle:Personalederivido,这就是您出现此错误的原因。考虑每次使用集合类型添加所有对象LlamadaDerivado,以更好地尊重映射。

查看Llamada实体,$derividos是LlamadaDerivado的数组集合,在LlamadaType中,您将其设置为entityType of AgendaBundle:PersonalDerivateDO,这就是您出现此错误的原因。考虑每次使用集合类型添加所有对象LLAMADERIVADO以更好地尊重映射。

您可以尝试在formtype中使用替代EntityType,尽管我面前有一段代码,它可以很好地处理EntityType和一对多关系的
多个
标志。

您可以尝试在formtype中使用a而不是EntityType,尽管我面前有一段代码,它与EntityType和一对一关系的
multiple
标志配合得很好。

谢谢您的回答。我试着这么做,但问题是,当我这么做时,只加载我在关系中拥有的实体,我需要选项列表显示所有可用的“PersonaleDerivata”。谢谢你的回答。我试着这么做,但问题是,当我这么做时,只加载我在关系中拥有的实体,我需要选项列表显示所有可用的“PersonaleDerivata”。谢谢你的回答。我试着这么做,但问题是,当我这么做时,只加载我在关系中拥有的实体,我需要选项列表显示所有可用的“PersonaleDerivata”。谢谢你的回答。我试图这样做,但问题是,当我这样做时,只加载我在关系中拥有的实体,我需要选项列表显示所有可用的“PersonalDerivata”。
<?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;
    }

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