Symfony3错误,具有多个属性
尝试在两个表中创建关系时出错,如下所示 Llamadas-| |-| |-| |-人物 我们正在尝试创建一个只有一个create表单,其中包含“LlamadaDerivada” 拉马达实体内部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 { /**
<?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();
}
}