Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Symfony 5:关系多个不保存_Php_Mysql_Doctrine Orm_Doctrine - Fatal编程技术网

Php Symfony 5:关系多个不保存

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

在我的项目中,我创建了两个实体:项目和类别。它们是多个关系 我正在使用Easy admin bundle来管理我的数据库,但问题是,当我尝试将一个类别添加到一个项目时,它不会保存,当我尝试将一个项目添加到一个类别时,它会工作,但我不知道为什么它会以另一种方式失败。谢谢你的帮助:)

类别

  <?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
和imho
return$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")