我有两个具有OneToMany / ManyToOne关系的实体(trip和tripAddOn)。一次旅行可以有很多tripAddOns,一次tripAddOn只能属于一次旅行。
在我的控制器类中,我尝试保持行程并且它成功地保持trip和tripAddOn,但是在tripAddOn表上缺少关联(trip_id为null)。
class Trip {
/**
* @ORM\Id()
* @ORM\GeneratedValue(strategy="AUTO")
*
* @var int
*/
protected $id;
/**
* @ORM\OneToMany(
* targetEntity="AppBundle\Entity\TripAddOn",
* 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
{
/**
* @ORM\Id
* @ORM\Column(type="integer", options={"unsigned"=true})
* @ORM\GeneratedValue(strategy="AUTO")
*
* @var int
*/
protected $id;
/**
* @ORM\ManyToOne(
* targetEntity="AppBundle\Entity\Trip",
* inversedBy="trip_add_ons",
* cascade={"persist"}
* )
* @ORM\JoinColumn(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上的“setTrip”没有被识别一样。
更新*:更改了Trip.php中的“setTripAddOns”方法。我注意到当我在“setTripAddOns”和“addTripAddOn”中都设置断点时,两者都没有被击中。我正在通过一个使用CollectionType for 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
]);
}
}
答案 0 :(得分:0)
在Trip类中,您需要在构造函数中初始化$ tripAddOns:
public __construct() {
this->tripAddOns = new ArrayCollection();
}
答案 1 :(得分:0)
试试这些:
$im = new Imagick();
$im->readImage($file); // path/to/file
$im->setImageCompressionQuality($quality); // 90,80,70 e.g.
$im->writeImage($file);
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;
}
在控制器中使用类似之前的内容。
答案 2 :(得分:0)
我在这里发现了问题。这不是" setTripAddOns"或者" addTripAddOn"被叫,所以Trip和TripAddOn之间没有关联。
Symfony集合表单使用
连接两个实体find_elements
它避免使用"添加"和"设置"方法。要更改此默认行为,您需要设置一个名为' by_reference'收集表单字段为false。