【问题标题】:Doctrine trying to persist Owner教义试图坚持所有者
【发布时间】:2017-03-31 12:14:45
【问题描述】:

我已经设置了独立于 Symfony 框架的 Doctrine 和 Symfony-forms(因为我不需要大部分)。

我遇到的问题是,当试图坚持一个具有“类型”学说的新“审计”时,似乎想要坚持关系的拥有方(类型)。

例如,审计可能有一种车辆服务。

 // -- Model/Audit.php --
 /**
 * @var \Model\Type
 *
 * @ORM\ManyToOne(targetEntity="Model\Audit\Type", inversedBy="audits")
 * @ORM\JoinColumn(name="type_id", referencedColumnName="id", nullable=true)
 */
private $type;
/**
 * Set type
 *
 * @param \Model\Type $type
 * @return Audit
 */
public function setType(\Model\Type $type)
{
    $this->type = $type;
    return $this;
}

然后在反面:

/**
 * @ORM\OneToMany(targetEntity="Model\Audit", mappedBy="type")
 * @var type */
private $audits;

public function __construct() {
     $this->audits = new \Doctrine\Common\Collections\ArrayCollection();
}

持久化代码如下:

$data = $form->getData();
$entityManager->persist($data);
$entityManager->flush();

最后的表单类是:

class AuditType extends AbstractType {

   public function buildForm(FormBuilderInterface $builder, array $options) {
       $builder
            ->add('name')
            ->add('type', 'entity', array(
                'class' => "Model\Type"
            ));
  }

所有看起来(至少在我看来)与 Doctrine 和 Symfony 方面的所有文档完全相同,但我收到了这个错误:

通过关系 'Model\Audit#type' 找到了一个新实体 未配置为对实体进行级联持久化操作: 车辆服务。要解决这个问题:要么显式调用 EntityManager#persist() 在这个未知实体上或配置级联 例如,在映射中保留此关联 @ManyToOne(..,cascade={"persist"})."

这真的很令人沮丧,因为我不想坚持 Type 方面,我只想将 3 的 id (在最基本的术语中)放入 type_id 列。然而,Doctrine 似乎认为我想创建一个新的“类型”,而我当然不会。它们已经存在。


使用 $entityManager->merge($audit);部分工作,它允许保存初始审计及其 FK。但是,它会导致所有嵌入的表单都被忽略。

【问题讨论】:

  • 在您的表单构建器中,尝试将 'type' 条目更改为 ->add('type', EntityType::class, array(
  • Entity 原样,与 EntityType:: 相同,但对于旧版本的 PHP,我没有提到,但我仅限于 5.3,因此 symfony-form 2.6..

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


【解决方案1】:

我认为你需要设置

/**
 * @ORM\OneToMany(targetEntity="Model\Audit", mappedBy="type")
 * @var type
 */
 private $audits;

 public function __construct() {
 $this->audits = new \Doctrine\Common\Collections\ArrayCollection();
 }

/**
 * @return ArrayCollection
 */
public function getAudits()
{
    return $this->audits;
}

/**
 * @param Audit $audit
 */
public function addAudits(Audit $audit)
{
    $this->audits->add($audit);
    $audit->setTyoe($this);
}

在类型 Audit.model 中

     // -- Model/Audit.php --
   /**
   * @var \Model\Type
   *
   * @ORM\ManyToOne(targetEntity="Model\Audit\Type", inversedBy="audits")
   * @ORM\JoinColumn(name="type_id", referencedColumnName="id", nullable=true)
   */
   private $type;
   /**
   * Set type
   *
   * @param \Model\Type $type
   * @return Audit
   */
   public function setType(\Model\Type $type)
   {
      $this->type = $type;
   }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多