我有两个具有OneTomany/Manutoone关系的实体(Trip and Tripaddon)。一次旅行可以有很多Tripaddons,而Tripaddon只能属于一次旅行。
在我的控制器课中,我试图坚持这次旅行,并且成功地持续了旅行和Tripaddon,但在Tripaddon表上,协会缺少(Trip_id为null)。
class Trip {
/**
* @ORMId()
* @ORMGeneratedValue(strategy="AUTO")
*
* @var int
*/
protected $id;
/**
* @ORMOneToMany(
* targetEntity="AppBundleEntityTripAddOn",
* mappedBy="trip",
* cascade={"persist"}
* )
*
* @var ArrayCollection
*/
protected $tripAddOns;
/**
* @return ArrayCollection
*/
public function getTripAddOns()
{
return $this->tripAddOns;
}
/**
* @param ArrayCollection $tripAddOns
* @return self
*/
public function setTripAddOns(ArrayCollection $tripAddOns)
{
$this->tripAddOns = $tripAddOns;
return $this;
}
/**
* @param TripAddOn $tripAddOn
* @return self
*/
public function addTripAddOn(TripAddOn $tripAddOn)
{
$tripAddOn->setTrip($this);
$this->tripAddOns->add($tripAddOn);
return $this;
}
}
tripaddon.php
class TripAddOn
{
/**
* @ORMId
* @ORMColumn(type="integer", options={"unsigned"=true})
* @ORMGeneratedValue(strategy="AUTO")
*
* @var int
*/
protected $id;
/**
* @ORMManyToOne(
* targetEntity="AppBundleEntityTrip",
* inversedBy="trip_add_ons",
* cascade={"persist"}
* )
* @ORMJoinColumn(name="trip_id", referencedColumnName="id")
*
* @var Trip
*/
protected $trip;
/**
* Get Trip
*
* @return Trip
*/
public function getTrip()
{
return $this->trip;
}
/**
* @param Trip $trip
* @return self
*/
public function setTrip(Trip $trip)
{
$this->trip = $trip;
return $this;
}
public function addTrip(Trip $trip)
{
$this->trip = $trip;
return $this;
}
控制器:
$entityManager = $this->getDoctrine()->getManager();
$entityManager->persist($trip);
$entityManager->flush();
再次,Tripaddon保存,但Trip_id为null。好像tripaddon.php上的"设定"未被识别。
Update*:更改了Trip.php中的" settripaddons"方法。我注意到,当我在" settripaddons"one_answers" addtripaddon"中放置断点时,两者都会被打击。我正在通过将CollectionType用于Tripaddons创建这些对象。
triptype.php
class TripType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('tripAddOns', CollectionType::class, [
'entry_type' => TripAddOnType::class,
'entry_options' => [
'data_class' => TripAddOn::class,
],
'allow_add' => true,
'allow_delete' => true,
])
}
}
tripaddontype.php
class TripAddOnType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('name', TextType::class)
->add('price', TextType::class)
;
}
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults([
'data_class' => TripAddOn::class
]);
}
}
在旅行类中,您需要在构造函数中初始化$ tripaddons:
public __construct() {
this->tripAddOns = new ArrayCollection();
}
尝试以下:
bin/console doctrine:cache:clear-metadata
bin/console doctrine:cache:clear-query
应该足够
/**
* @param TripAddOn $tripAddOn
* @return self
*/
public function addTripAddOn(TripAddOn $tripAddOn)
{
$this->tripAddOns[] = $tripAddOn;
return $this;
}
确保$trip->addTripAddon($tripAddonObject)
在控制器中使用了以前的使用。
我在这里找到了问题。正是" stripaddons"或" addtripaddon"都没有被称为,因此Trip和Tripaddon之间没有关联。
Symfony Collection表单通过使用
连接两个实体$trip->getTripAddOns->add($tripAddOn)
它避免使用"添加"one_answers"集"方法。要更改此默认行为,您需要在集合表单字段上设置一个名为" By_Reference"的选项。