Фактическая сущность:
<?php
namespace App\Entity;
use ApiPlatform\Core\Annotation\ApiResource;
/**
* @ApiResource(
* normalizationContext={"groups"={"get"}, "enable_max_depth"=true},
* denormalizationContext={"groups"={"write"}}
* )
* @ORM\Entity(repositoryClass="App\Repository\ActualiteRepository")
*/
class Actualite
{
/**
* @ORM\Id()
* @ORM\GeneratedValue()
* @ORM\Column(type="integer")
*/
private $id;
/**
* @var string titre actualite
* @ORM\Column(type="string", length=255)
* @Assert\NotBlank
* @Groups({"get", "write"})
*/
private $titre;
/**
* @var text contenu actualite
* @ORM\Column(type="text")
* @Assert\NotBlank
* @Groups({"write", "get"})
*/
private $contenu;
/**
* @ORM\OneToMany(targetEntity="App\Entity\Comment", mappedBy="actualite", cascade={"all"})
* @Groups({"get"})
*/
private $comments;
public function __construct()
{
$this->comments = new ArrayCollection();
}
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;
}
/**
* @return Collection|Comment[]
*/
public function getComments(): Collection
{
return $this->comments;
}
public function addComment(Comment $comment): self
{
if (!$this->comments->contains($comment)) {
$this->comments[] = $comment;
$comment->setActualite($this);
}
return $this;
}
public function removeComment(Comment $comment): self
{
if ($this->comments->contains($comment)) {
$this->comments->removeElement($comment);
// set the owning side to null (unless already changed)
if ($comment->getActualite() === $this) {
$comment->setActualite(null);
}
}
return $this;
}
public function getContenu(): ?string
{
return $this->contenu;
}
public function setContenu(string $contenu): self
{
$this->contenu = $contenu;
return $this;
}
}
Комментарий сущности:
<?php
namespace App\Entity;
use ApiPlatform\Core\Annotation\ApiResource;
/**
* @ApiResource(
* normalizationContext={"groups"={"get"}, "enable_max_depth"=true},
* )
* @ORM\Entity(repositoryClass="App\Repository\CommentRepository")
*/
class Comment
{
/**
* @ORM\Id()
* @ORM\GeneratedValue()
* @ORM\Column(type="integer")
*/
private $id;
/**
* @ORM\ManyToOne(targetEntity="App\Entity\Actualite", inversedBy="comments")
* @ORM\JoinColumn(name="actualite_id", referencedColumnName="id")
* @Assert\NotBlank
* @Groups({"get"})
* @MaxDepth(1)
*/
private $actualite;
/**
* @var string email
* @ORM\Column(type="string", length=255)
* @Assert\NotBlank
*/
private $email;
/**
* @var text commentaire
* @ORM\Column(type="text")
* @Assert\NotBlank
* @Groups({"get"})
*/
private $message;
public function __construct()
{
$this->ajouter = new \Datetime();
}
public function getId(): ?int
{
return $this->id;
}
public function getActualite(): ?Actualite
{
return $this->actualite;
}
public function setActualite(?Actualite $actualite): self
{
$this->actualite = $actualite;
return $this;
}
public function getEmail(): ?string
{
return $this->email;
}
public function setEmail(string $email): self
{
$this->email = $email;
return $this;
}
public function getMessage(): ?string
{
return $this->message;
}
public function setMessage(string $message): self
{
$this->message = $message;
return $this;
}
}
после того, как я вставил некоторые данные в таблицы, все работает отлично:
в таблице Actualite
+----+---------+---------+
| id | titre | contenu |
+----+---------+---------+
| 1 | titre1 | lorem 1 |
| 2 | titre2 | lorem2 |
| 3 | titre3 | lorem3 |
+----+---------+---------+
в таблице Комментарий
+----+--------------+---------+-----------+
| id | actualite_id | email | message |
+----+--------------+---------+-----------+
| 1 | 1 | e@e.com | someText |
| 2 | 2 | b@b.com | someText1 |
| 3 | 2 | a@a.com | text |
| 4 | 3 | q@a.com | text2 |
+----+--------------+---------+-----------+
Я хочу изменить идентификатор iten (id = 2) в таблице Actualite, я также должен изменить factite_id в связанной таблице: вот так ==>
в таблице Actualite
+----+---------+---------+
| id | titre | contenu |
+----+---------+---------+
| 1 | titre1 | lorem 1 |
| 4 | titre2 | lorem2 |
| 3 | titre3 | lorem3 |
+----+---------+---------+
в таблице Комментарий
+----+--------------+---------+-----------+
| id | actualite_id | email | message |
+----+--------------+---------+-----------+
| 1 | 1 | e@e.com | someText |
| 2 | 4 | b@b.com | someText1 |
| 3 | 4 | a@a.com | text |
| 4 | 3 | q@a.com | text2 |
+----+--------------+---------+-----------+
Я пытался выполнить эту операцию с помощью Api-платформы , метод PUT не работает:
JSON запрос:
URL: http://127.0.0.1:8000/api/actualites/2
{
"id": 4
}
ничего не меняется!
Также я попытался создать контроллер Costum для выполнения этой операции:
// scr/Controller/CustomController.php
<?php
namespace App\Controller;
use App\Entity\Actualite;
use App\Entity\Comment;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
class CustomController extends AbstractController
{
/**
*
* @Route("/cid")
*/
public function cidAction()
{
$em = $this->getDoctrine()->getManager();
$actualite = $this->getDoctrine()
->getRepository(Actualite::class)
->cid('2', '4');
return new Response('ok', Response::HTTP_CREATED);
}
}
и
<?php
/// src/RepositoryActualiteRepository.php
namespace App\Repository;
use App\Entity\Actualite;
use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
use Symfony\Bridge\Doctrine\RegistryInterface;
/**
* @method Actualite|null find($id, $lockMode = null, $lockVersion = null)
* @method Actualite|null findOneBy(array $criteria, array $orderBy = null)
* @method Actualite[] findAll()
* @method Actualite[] findBy(array $criteria, array $orderBy = null, $limit = null, $offset = null)
*/
class ActualiteRepository extends ServiceEntityRepository
{
public function __construct(RegistryInterface $registry)
{
parent::__construct($registry, Actualite::class);
}
/**
* @return Actualite[] Returns an array of Actualite objects
*/
public function cid($id, $value)
{
$qb = $this->createQueryBuilder('a')
->update()
->set('a.id', $value)
->where('a.id = :val')
->setParameter('val', $id);
return $qb->getQuery()->getResult();
}
}
Я получаю сообщение об ошибке:
SQLSTATE[23000]: Integrity constraint violation: 1451 Cannot delete or update a parent row: a foreign key constraint fails (`api`.`comment`, CONSTRAINT `FK_9474526CA2843073` FOREIGN KEY (`actualite_id`) REFERENCES `actualite` (`id`))
Как я могу изменить идентификатор элемента в сущности Actualite и изменить фактический_идентификатор в связанном объекте?
Как я могу сделать эту операцию?