gpt4 book ai didi

symfony - Doctrine 不会在我的 OneToMany 关联中保存数据

转载 作者:行者123 更新时间:2023-12-04 07:56:06 25 4
gpt4 key购买 nike

我将 Symfony 4 与 Sonata Admin 一起使用。我有一个项目对多个新闻协会。
我在我的项目管理页面尝试添加一些新闻并更新项目时发现了一个问题。问题是新闻尚未添加到项目中。然后我通过将此代码添加到我的 ProjectsAdmin.php 文件中解决了这个问题:

 public function prePersist($project)
{
$this->preUpdate($project);
}

public function preUpdate($project)
{
$project->setNews($project->getNews());
}
但是仍然存在一些问题。第二个是我无法从项目中删除新闻,单击更新按钮后什么也没有发生。当然,如果我在我的项目实体中使用“orphanRemoval=true”作为字段新闻,它会起作用,但它会删除我只想从项目中删除的新闻。
我该如何解决这个问题?
最后但并非最不重要的是,我有 PreUpdate 事件监听器,用于检查:如果我更新项目实体而不是将所有新闻添加到该项目。问题是当我为 Projects Entity 做同样的事情时它不起作用,但是当我为 News Entity 做同样的事情时它就起作用了。我忘了提到它与我在管理面板中的问题非常相似,因为当我转到新闻管理并尝试将项目添加到新闻时,它无需任何修复即可工作,当我尝试从新闻管理中的新闻中删除项目时,它也按预期工作。所以在 inversedBy 方面一切正常,但在 mappingBy 方面我有问题。
这是我的事件监听器:
 public function PreUpdate(LifecycleEventArgs $args): void {
$entity = $args->getEntity();
$newsRepo = $args->getEntityManager()->getRepository(News::class);
if ($entity instanceof Projects) {
foreach ($newsRepo as $new){
$news = $args->getEntityManager()->getReference(News::class, $new->getId());
$entity->setNews($news);
}
}
}
我的项目实体:
/**
* @ORM\Entity(repositoryClass=ProjectsRepository::class)
* @ORM\HasLifecycleCallbacks()
*/
class Projects {
/**
* @ORM\OneToMany(targetEntity=News::class, mappedBy="project", orphanRemoval=true)
*/
private $news;

public function __construct() {
$this->news = new ArrayCollection();
}

/**
* @return Collection|News[]
*/
public function getNews(): Collection {
return $this->news;
}

/**
* @param mixed $news
* @return Projects
*/
public function setNews($news) {
if (count($news) > 0) {
foreach ($news as $i) {
$this->addNews($i);
}
}
return $this;
}

/**
* @param News $news
*/
public function addNews(News $news) {
$news->setProject($this);
$this->news->add($news);
}

/**
* @param News $news
*/
public function removeNews(News $news) {
$this->news->removeElement($news);
}
}
新闻实体:
/**
* @ORM\Entity(repositoryClass="App\Repository\NewsRepository")
* @ORM\HasLifecycleCallbacks()
*/
class News {
/**
* @ORM\ManyToOne(targetEntity=Projects::class, inversedBy="news")
* @ORM\JoinColumn(nullable=true)
*/
private $project;

public function getProject(): ?Projects {
return $this->project;
}

public function setProject(?Projects $project): self {
$this->project = $project;

return $this;
}
}
项目库:
/**
* @method Projects|null find($id, $lockMode = null, $lockVersion = null)
* @method Projects|null findOneBy(array $criteria, array $orderBy = null)
* @method Projects[] findAll()
* @method Projects[] findBy(array $criteria, array $orderBy = null, $limit = null, $offset = null)
*/
class ProjectsRepository extends ServiceEntityRepository
{
public function __construct(ManagerRegistry $registry)
{
parent::__construct($registry, Projects::class);
}
}
新闻库:
/**
* @method News|null find($id, $lockMode = null, $lockVersion = null)
* @method News|null findOneBy(array $criteria, array $orderBy = null)
* @method News[] findAll()
* @method News[] findBy(array $criteria, array $orderBy = null, $limit = null, $offset = null)
*/
class NewsRepository extends ServiceEntityRepository
{
public function __construct(ManagerRegistry $registry)
{
parent::__construct($registry, News::class);
}
}

最佳答案

首先你的ProjectsAdmin:prePersistProjectsAdmin:preUpdate方法似乎没有完成任何事情。其次,您的事件监听器看起来也不对。我认为这些代码中的任何一个都是不必要的,因为您应该能够在实体级别解决这个问题。
NewsAdmin 中一切正常的原因是News是关系的拥有方,因此当您从 Projects 编辑关系时一边还必须调用News上的相应方法边。另外,你说你可以成功添加News项目到Projects但无法删除它们,让我们比较您的 Projects:addNews方法与您的 Projects:removeNews方法。您将看到正在运行的 Projects:addNews方法影响所有权变更 News一边,一边不工作Projects:removeNews方法只作用于 Projects边。您应该只需要修改 Projects:removeNews设置 News:project属性(property)到null .

/**
* @param News $news
*/
public function addNews(News $news) {
// next line makes this work
$news->setProject($this);
$this->news->add($news);
}

/**
* @param News $news
*/
public function removeNews(News $news) {
// make this work the same way with next line
$news->setProject(null);
$this->news->removeElement($news);
}

关于symfony - Doctrine 不会在我的 OneToMany 关联中保存数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66695050/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com