学说 - 不保存外键(值为null)



我有两个具有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"的选项。

相关内容

  • 没有找到相关文章

最新更新