Doctrine 2 avec Symfony 4.2.5及FOSRestBundle-OneToMany关联-Redondant注册

问题描述 投票:0回答:1

这里是问题:

[两个实体,书籍和Auteurs。一本书只有一个作者,一个作者可以有多本书。

如果我在Auteurs表中创建一本具有现有auteur的书,则在填充库时,这会(错误地)在表中创建重复项。

级联=“ persist”注释的存在是此副本的起点。如果删除此注释,则会出现错误:

{“错误”:{“代码”:500,“消息”:“内部服务器错误”,“例外”:[{“消息”:“通过关系'App \ Entity \ Books#找到了一个新实体auteur'.....

如何处理这个问题?我的代码:控制器:

<?php

namespace App\Controller;

use App\Entity\Books;
use FOS\RestBundle\Controller\Annotations as Rest;
use FOS\RestBundle\Controller\FOSRestController;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\ParamConverter;

class EcritureController extends FOSRestController
{
    /**
     * @Rest\Post(
     *  path = "/creer-book")
     * @Rest\View(StatusCode = 201)
     * @ParamConverter("book", converter="fos_rest.request_body")
     */
    public function creerBook(Books $book)
    {
        $em->persist($book);
        $em->flush();
        return $book;
    }
}

实体书籍:

<?php

namespace App\Entity;

use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity(repositoryClass="App\Repository\BooksRepository")
 */
class Books
{
    /**
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     */
    private $id;

    /**
     * @ORM\Column(type="string", length=255)
     */
    private $titre;

    /**
     * @ORM\ManyToOne(targetEntity="App\Entity\Books", inversedBy="Books", cascade={"persist"})
     * @ORM\JoinColumn(nullable=false)
     */
    private $auteur;

    public function getId(): ?int
    {
        return $this->id;
    }

    public function getTitre(): ?string
    {
        return $this->Titre;
    }

    public function setTitre(string $titre): self
    {
        $this->titre = $titre;

        return $this;
    }

    public function getAuteur(): ?Auteurs
    {
        return $this->auteur;
    }

    public function setAuteur(?Auteurs $auteur): self
    {
        $this->auteur = $auteur;

        return $this;
    }
}

实体Auteurs:

<?php

namespace App\Entity;

use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity(repositoryClass="App\Repository\AuteursRepository")
 */
class Auteurs
{
    /**
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     */
    private $id;

    /**
     * @ORM\Column(type="string", length=10)
     */
    private $nom;

    /**
     * @ORM\OneToMany(targetEntity="App\Entity\Books", mappedBy="auteur") 
     */
    private $books;

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

    public function getId(): ?int
    {
        return $this->id;
    }

    public function getNom(): ?string
    {
        return $this->nom;
    }

    public function setNom(string $nom): self
    {
        $this->nom = $nom;

        return $this;
    }

    /**
     * @return Collection|Books[]
     */
    public function getBooks(): Collection
    {
        return $this->books;
    }

    public function addBook(Books $book): self
    {
        if (!$this->books->contains($book)) {
            $this->books[] = $book;
            $book->setBook($this);
        }
        return $this;
    }

    public function removeBook(Books $book): self
    {
        if ($this->books->contains($book)) {
            $this->sujets->removeElement($book);
            // set the owning side to null (unless already changed)
            if ($book->getAuteur() === $this) {
                $book->setAuteur(null);
            }
        }
        return $this;
    }
}
doctrine-orm fosrestbundle symfony-4.2
1个回答
0
投票

错误是“坚持”“许多”方面。必须坚持“一个”方面,如下所示:

        $auteurId = $book->getAuteur()->getId();
        $auteur= $em->getRepository('App:Auteurs')->find($auteurId);
        $response = new Response();
        if ($auteur) {
            $auteur->addBook($book);
            $em->persist($auteur);
            $em->flush();
            $response->setContent('Chain of your choice', Response::HTTP_OK);
        } else {
            $response->setContent('Auteur selected doesn\'t exist', Response::HTTP_NOT_ACCEPTABLE);
        }

        return $response;
© www.soinside.com 2019 - 2024. All rights reserved.