我有一个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;
}
答案 0 :(得分:0)
答案 1 :(得分:0)
如果你坚持所有实体会更好:
$em = $this->getDoctrine()->getManager();
$em->persist([$news, $article]);
$em->flush();
祝你好运!