Doctrine - 不保存外键(值为null)

时间:2017-09-26 21:00:32

标签: php symfony doctrine-orm orm symfony-forms

我有两个具有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
        ]);
    }
}

3 个答案:

答案 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。