【发布时间】:2017-03-29 21:03:08
【问题描述】:
我有这个错误的问题:
Expected argument of type "AppBundle\Entity\BusVehiclesAmenities", "Doctrine\Common\Collections\ArrayCollection" given
编辑 3
经过几个 cmets,我应用了建议并且错误现在消失了(从公共汽车设施实体中删除 ArrayCollection,从控制器中删除设置公共汽车设施实体并删除所有映射实体上的 ORM 连接列)
现在我有这个错误:
The association AppBundle\Entity\BusVehiclesAmenities#bus refers to the inverse side field AppBundle\Entity\BusVehicles#busVehiclesAmenities which does not exist.
映射实体
公交车:
/* @ORM\OneToMany(
* targetEntity="BusVehiclesAmenities",
* mappedBy="bus",
* fetch="EXTRA_LAZY",
* orphanRemoval=true,
* cascade={"persist"}
* )
*
*/
private $busVehiclesAmenities;
公共汽车设施实体:
private $bus;
/**
*
* @ORM\ManyToOne(targetEntity="Amenities", inversedBy="amenities")
* @ORM\JoinColumn(name="amenities_id", referencedColumnName="id")
*
*/
我正在使用表单集合来创建 OneToMany 关系。问题是当我添加新数据时出现此错误。
有人知道问题出在哪里吗?
代码: 总线实体(父)
/**
* @ORM\OneToMany(targetEntity="BusVehiclesAmenities", mappedBy="bus", cascade={"persist", "remove"}, fetch="EAGER", orphanRemoval=true)
* @ORM\JoinColumn(name="bus_id", referencedColumnName="id", onDelete="CASCADE")
*
*/
private $busVehiclesAmenities;
public function __construct()
{
$this->busVehiclesAmenities = new ArrayCollection();
}
/**
* Get id
*
* @return integer
*/
public function getId()
{
return $this->id;
}
/**
* Add busVehiclesAmenities
*
* @param \AppBundle\Entity\BusVehiclesAmenities busVehiclesAmenities
* @return BusVehicles
*/
public function addBusVehiclesAmenities(BusVehiclesAmenities $busVehiclesAmenities)
{
if ($this->busVehiclesAmenities->contains($busVehiclesAmenities)) {
return;
}
$this->busVehiclesAmenities->add($busVehiclesAmenities);
$busVehiclesAmenities->addBus($this);
return $this;
}
/**
* Set busVehiclesAmenities
*
* @param \AppBundle\Entity\BusVehiclesAmenities busVehiclesAmenities
* @return BusVehicles
*/
public function setBusVehiclesAmenities(BusVehiclesAmenities $busVehiclesAmenities)
{
$this->busVehiclesAmenities = $busVehiclesAmenities;
return $this;
}
/**
* Remove busVehiclesAmenities
*
* @param \AppBundle\Entity\BusVehiclesAmenities $busVehiclesAmenities
* @return BusVehicles
*/
public function removeBusVehiclesAmenities(BusVehiclesAmenities $busVehiclesAmenities)
{
if (!$this->busVehiclesAmenities->contains($busVehiclesAmenities)) {
return;
}
$this->busVehiclesAmenities->removeElement($busVehiclesAmenities);
$busVehiclesAmenities->removeBus($this);
return $this;
}
设施实体(儿童)
/**
*
* @ORM\ManyToOne(targetEntity="BusVehicles", inversedBy="busVehiclesAmenities")
* @ORM\JoinColumn(name="bus_id", referencedColumnName="id")
*
*/
private $bus;
public function __construct()
{
$this->bus = new ArrayCollection();
}
/**
* Get id
*
* @return integer
*/
public function getId()
{
return $this->id;
}
/**
* @param BusVehicles $busVehicles
*/
public function addBus(BusVehicles $busVehicles)
{
if ($this->bus->contains($busVehicles)) {
return;
}
$this->bus->add($busVehicles);
$busVehicles->addBusVehiclesAmenities($this);
}
/**
* @param BusVehicles $busVehicles
*/
public function removeBus(BusVehicles $busVehicles)
{
if (!$this->bus->contains($busVehicles)) {
return;
}
$this->bus->removeElement($busVehicles);
$busVehicles->removeBusVehiclesAmenities($this);
}
编辑 1:
我从 BusVehiclesAmenitites 实体中删除了 ArrayCollection,但我在提交表单时仍然遇到同样的错误。
编辑 2:
添加表单
BusVehicles 表单类型
<?php
namespace AdminBundle\Form\Type;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use Symfony\Component\Form\Extension\Core\Type\CollectionType;
class BusVehiclesType extends AbstractType
{
/**
* {@inheritdoc}
*/
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add('licencePlate')
->add('chassisNumber')
->add('manufacturer')
->add('busVehiclesAmenities', CollectionType::class, array(
'entry_type' => BusVehiclesAmenitiesType::class,
'prototype' => true,
'allow_add' => true,
'allow_delete' => true,
'by_reference' => false,
));
}
/**
* {@inheritdoc}
*/
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'AppBundle\Entity\BusVehicles',
'cascade_validation' => true,
));
}
/**
* {@inheritdoc}
*/
public function getBlockPrefix()
{
return 'adminbundle_busvehicles';
}
}
BusVehiclesAmenities 表单类型
<?php
namespace AdminBundle\Form\Type;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\NumberType;
use Symfony\Component\Form\FormBuilderInterface;
use AppBundle\Entity\BusVehiclesAmenities;
use Symfony\Component\OptionsResolver\OptionsResolver;
class BusVehiclesAmenitiesType extends AbstractType
{
/**
* {@inheritdoc}
*/
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('price', NumberType::class, array(
))
->add('amenities', EntityType::class, array(
'class' =>'AppBundle:Amenities',
'choice_label' => 'name',
))
;
}
/**
* {@inheritdoc}
*/
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults(array(
'data_class' => BusVehiclesAmenities::class
));
}
/**
* {@inheritdoc}
*/
public function getBlockPrefix()
{
return 'appbundle_busvehiclesamenities';
}
}
控制器。
/**
* @Template
*/
public function newAction(Request $request)
{
$bus = new BusVehicles();
$busAmenities = new BusVehiclesAmenities();
// $this->getDoctrine()->getManager()->persist($busAmenities);
$bus->setBusVehiclesAmenities($busAmenities);
$form = $this->createForm(BusVehiclesType::class, $bus);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$em = $this->getDoctrine()->getManager();
/*$form->get('busVehiclesAmenities')->getData()->map(
function ($amenities) use ($em, $bus) {
$bus->setBusVehiclesAmenities($amenities);
$em->persist($amenities);
}
);*/
$em->persist($bus);
$em->flush();
// Adding flash message to our user
$this->addFlash('success', 'admin.bus.created');
// return $this->redirectToRoute('bus_add');
}
return [
'form' => $form->createView(),
];
}
【问题讨论】:
标签: php symfony doctrine-orm symfony-forms symfony-3.1