Symfony Form / Doctrine:保存尚未持久化的实体的外键

时间:2016-07-07 09:38:09

标签: php doctrine symfony

我有一个Symfony来创建实体threadPool.isThreadAvailable(); 的新记录。其中一个属性是News,它与实体$newsArticle具有一对多关系,并保存新闻记录的翻译。 我的表单应该一次创建一个新的NewsArticle记录和一个相关的News记录(标准语言)。 Imho在@ORM Annotations的帮助下正确定义了关系:

NewsArticle

问题:发送表单后,会创建新闻和新闻文章记录,但字段class News { // ... /** * @ORM\OneToMany(targetEntity="NewsArticle", mappedBy="news", cascade={"persist", "remove"}) */ protected $newsArticle; // ... /** * Add newsArticle * * @param \Acme\Bundle\Entity\NewsArticle $newsArticle * * @return News */ public function addNewsArticle(\Acme\Bundle\Entity\NewsArticle $newsArticle) { $this->newsArticle[] = $newsArticle; return $this; } } class NewsArticle { // ... /** * @ORM\ManyToOne(targetEntity="News", inversedBy="newsArticle") * @ORM\JoinColumn(name="news_id", referencedColumnName="id") */ private $news; } 没有值。

关于这个问题,我在Symfony Docs Doctrine:Cascading Relations并保存“Inverse”方)中找到了一个带有多对多关系解决方案的示例:

  

诀窍是确保在每个“标签”上设置单个“任务”。   一个简单的方法是为addTag()添加一些额外的逻辑   由表单类型调用,因为by_reference设置为false:

news_id
     

Inside Tag,只需确保你有一个addTask方法:

// src/AppBundle/Entity/Task.php

// ...
public function addTag(Tag $tag)
{
    $tag->addTask($this);

    $this->tags->add($tag);
}
     

如果您有一对多的关系,那么解决方法就是   类似的,除了你可以简单地从addTag里面调用setTask。

因此我扩展了我的代码:

// src/AppBundle/Entity/Tag.php

// ...
public function addTask(Task $task)
{
    if (!$this->tasks->contains($task)) {
        $this->tasks->add($task);
    }
}

...遗憾的是,这会导致错误消息:

  

必须管理传递到选择字段的实体。也许坚持下去   他们在实体经理?

我不知道如何解决这个问题。请问有人能给我一个提示吗?或者甚至是创建不存在的相关实体的更好解决方案?

提前致谢!

编辑:NewsController(摘录)

public function addNewsArticle(\Acme\Bundle\Entity\NewsArticle $newsArticle)
{
    $newsArticle->setNews($this);
    $this->newsArticle[] = $newsArticle;

    return $this;
}

2 个答案:

答案 0 :(得分:0)

似乎我已经解决了这个问题,它不在我在我的问题中发布的代码中,而是在FormType代码中。

答案 1 :(得分:0)

如果你坚持所有实体会更好:

$em = $this->getDoctrine()->getManager();
$em->persist([$news, $article]);
$em->flush();
祝你好运!