Php Symfony 5:关系多个不保存
在我的项目中,我创建了两个实体:项目和类别。它们是多个关系 我正在使用Easy admin bundle来管理我的数据库,但问题是,当我尝试将一个类别添加到一个项目时,它不会保存,当我尝试将一个项目添加到一个类别时,它会工作,但我不知道为什么它会以另一种方式失败。谢谢你的帮助:) 类别Php Symfony 5:关系多个不保存,php,mysql,doctrine-orm,doctrine,Php,Mysql,Doctrine Orm,Doctrine,在我的项目中,我创建了两个实体:项目和类别。它们是多个关系 我正在使用Easy admin bundle来管理我的数据库,但问题是,当我尝试将一个类别添加到一个项目时,它不会保存,当我尝试将一个项目添加到一个类别时,它会工作,但我不知道为什么它会以另一种方式失败。谢谢你的帮助:) 类别 <?php namespace App\Entity; use App\Repository\CategoryRepository; use Doctrine\Common\Colle
<?php
namespace App\Entity;
use App\Repository\CategoryRepository;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping as ORM;
/**
* @ORM\Entity(repositoryClass=CategoryRepository::class)
* @ORM\Table(name="category")
*/
class Category
{
/**
* @ORM\Id
* @ORM\GeneratedValue
* @ORM\Column(type="integer")
*/
private $id;
/**
* @ORM\Column(type="string", length=255)
*/
private $title;
/**
* @ORM\Column(type="text")
*/
private $body;
/**
* @ORM\Column(type="string", length=255)
*/
private $image;
/**
* @ORM\Column(type="datetime")
*/
private $createdAt;
/**
* @ORM\ManyToMany(targetEntity=Projects::class, inversedBy="category",cascade={"persist"})
*
*/
private $projects;
public function __construct()
{
$this->projects = new ArrayCollection();
}
public function getId(): ?int
{
return $this->id;
}
public function getTitle(): ?string
{
return $this->title;
}
public function setTitle(string $title): self
{
$this->title = $title;
return $this;
}
public function getBody(): ?string
{
return $this->body;
}
public function setBody(string $body): self
{
$this->body = $body;
return $this;
}
public function getImage(): ?string
{
return $this->image;
}
public function setImage(string $image): self
{
$this->image = $image;
return $this;
}
public function getCreatedAt(): ?\DateTimeInterface
{
return $this->createdAt;
}
public function setCreatedAt(\DateTimeInterface $createdAt): self
{
$this->createdAt = $createdAt;
return $this;
}
/**
* @return Collection|projects[]
*/
public function getProjects(): Collection
{
return $this->projects;
}
public function addProjects(projects $project): self
{
if (!$this->projects->contains($project)) {
$this->projects[] = $project;
$project->addCategory($this);
}
return $this;
}
public function removeProjects(projects $project): self
{
if ($this->projects->contains($project)) {
$this->projects->removeElement($project);
$project->removeCategory($this);
}
return $this;
}
public function __toString()
{
return $this->title;
}
}
我怀疑,加法器和移除器从未被调用过。在Category::getProjects的情况下,您返回集合,当集合发生更改时,将导致数据库中的更新,因为它是关系的拥有方
然而,在另一方面,您得到了Projects::getCategory,它还返回集合,该集合可能已被修改,但更改根本不会传播到数据库,因为它是相反的一面
要解决这个问题,我想你必须解决你的多元化问题:
Category的属性应称为$projects,getter应称为getProjects
和imhoreturn$this->projects->toArray()代码>(应隐藏实现细节),加法器应命名为addProject
(注意缺少的s)和移除器removeProject
。Symfony将处理不同的复数形式,并了解调用哪些方法
该类应称为Project(无复数形式),类似地,getter、adder和remove也有其名称getCategories
、addcategority
和removeCategory
。同样,在getter中返回$this->categories->toArray()。提供集合可能会导致bundle直接编辑集合,特别是当加法器和移除器的名称怪异时
在这些更改之后(当然也调整了@manytomy注释),它应该可以工作(tm)。它可以工作映射是错误的,应该是这样的
类别
像这样的项目
@ORM\ManyToMany(targetEntity=Category::class, inversedBy="projects")
然后我删除了数据库并更新了模式。。。再加上多元化的修正
你说它“不会保存”的话太多了。请在您的问题中添加错误消息。Project::addCategory可能需要正确的签名,category
类型提示应该有大写字母c。@jakumi也不起作用,我在youtube上上传了一个视频,希望它能更详细地描述这个看起来确实很奇怪的问题。能否将dump($category)
添加到add/removeCategory函数中,以查看a)它是否进入函数,b)它是否进入if子句?(你必须再次检查重定向请求的探查器@jakumi i fallow ur步骤一个接一个仍然不起作用,但在实体映射中我得到了这个错误,我认为,你的(原始)映射也很好,但结合已损坏的复数运算,没有调用加法器/移除器,而是修改了集合。由于您更改了哪个实体是拥有方和反向方,您是否仔细检查了以前的操作(将项目添加到类别中)仍然有效?-实体类名称真的不应该有复数s,只是混淆了af。
@ORM\ManyToMany(targetEntity=Projects::class, mappedBy="categories")
@ORM\ManyToMany(targetEntity=Category::class, inversedBy="projects")