如何解决Symfony / API平台-多对多关系仅以一种方式起作用
我正在一个项目中,我需要将“文章”和“地址”实体关联到“ FAQ”实体。所以我在我的常见问题实体中写下了这两个关系
/**
* @ORM\ManyToMany(targetEntity=Article::class,inversedBy="faqs")
* @Groups({"api_backend"})
* @MaxDepth(1)
*/
private $article;
/**
* @ORM\ManyToMany(targetEntity=Adresse::class,inversedBy="faqs")
* @Groups({"api_backend"})
* @MaxDepth(1)
*/
private $address;
并将这些属性添加到我的Adresse.php
/**
* @ORM\ManyToMany(targetEntity=Faq::class,mappedBy="address")
* @Groups({"api_backend"})
* @MaxDepth(1)
*/
private $faqs;
和Article.php
/**
* @ORM\ManyToMany(targetEntity=Faq::class,mappedBy="article")
* @Groups({"api_backend"})
* @MaxDepth(1)
*/
private $faqs;
当我尝试将一篇文章添加到我的常见问题解答中时,效果很好
[2020-10-27 03:31:50] doctrine.DEBUG: "START TRANSACTION" [] []
[2020-10-27 03:31:50] doctrine.DEBUG: UPDATE faq SET enabled = ? WHERE id = ? [true,3] []
[2020-10-27 03:31:50] doctrine.DEBUG: INSERT INTO faq_article (faq_id,article_id) VALUES (?,?) [3,352] []
[2020-10-27 03:31:50] doctrine.DEBUG: "COMMIT" [] []
但是当我尝试添加地址时,它就被忽略了,没有任何错误
[2020-10-27 03:41:18] doctrine.DEBUG: "START TRANSACTION" [] []
[2020-10-27 03:41:18] doctrine.DEBUG: UPDATE faq SET enabled = ? WHERE id = ? [true,3] []
[2020-10-27 03:41:18] doctrine.DEBUG: "COMMIT" [] []
与我的关系没有任何关系显示在日志中,并且该关系也没有在数据库中更新。
有趣的是,它在另一个方向上很好用,但是我不能在我的应用程序中使用它。
[2020-10-27 03:45:07] doctrine.DEBUG: "START TRANSACTION" [] []
[2020-10-27 03:45:08] doctrine.DEBUG: INSERT INTO faq_adresse (faq_id,adresse_id) VALUES (?,16] []
[2020-10-27 03:45:08] doctrine.DEBUG: "COMMIT" [] []
如果我在数据库中手动添加该关系,则在获得我的常见问题实体后就能看到它
有人知道吗?我真的被卡在这里
编辑:我在该项目上安装了旧版easy_admin,并且一切正常,因此api平台方面确实存在问题。
解决方法
Address.php
<?php
namespace App\Entity;
use ApiPlatform\Core\Annotation\ApiResource;
use App\Repository\AddressRepository;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping as ORM;
/**
* @ApiResource()
* @ORM\Entity(repositoryClass=AddressRepository::class)
*/
class Address
{
/**
* @ORM\Id
* @ORM\GeneratedValue
* @ORM\Column(type="integer")
*/
private $id;
/**
* @ORM\Column(type="string",length=255)
*/
private $address1;
/**
* @ORM\Column(type="string",length=255)
*/
private $address2;
/**
* @ORM\ManyToMany(targetEntity=FAQ::class,mappedBy="addresses")
*/
private $faqs;
public function __construct()
{
$this->faqs = new ArrayCollection();
}
public function getId(): ?int
{
return $this->id;
}
public function getAddress1(): ?string
{
return $this->address1;
}
public function setAddress1(string $address1): self
{
$this->address1 = $address1;
return $this;
}
public function getAddress2(): ?string
{
return $this->address2;
}
public function setAddress2(string $address2): self
{
$this->address2 = $address2;
return $this;
}
/**
* @return Collection|FAQ[]
*/
public function getFaqs(): Collection
{
return $this->faqs;
}
public function addFaq(FAQ $faq): self
{
if (!$this->faqs->contains($faq)) {
$this->faqs[] = $faq;
$faq->addAddress($this);
}
return $this;
}
public function removeFaq(FAQ $faq): self
{
if ($this->faqs->removeElement($faq)) {
$faq->removeAddress($this);
}
return $this;
}
}
Article.php
<?php
namespace App\Entity;
use ApiPlatform\Core\Annotation\ApiResource;
use App\Repository\ArticleRepository;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping as ORM;
/**
* @ApiResource()
* @ORM\Entity(repositoryClass=ArticleRepository::class)
*/
class Article
{
/**
* @ORM\Id
* @ORM\GeneratedValue
* @ORM\Column(type="integer")
*/
private $id;
/**
* @ORM\Column(type="string",length=255)
*/
private $title;
/**
* @ORM\Column(type="string",length=255)
*/
private $description;
/**
* @ORM\ManyToMany(targetEntity=FAQ::class,mappedBy="articles")
*/
private $faqs;
public function __construct()
{
$this->faqs = 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 getDescription(): ?string
{
return $this->description;
}
public function setDescription(string $description): self
{
$this->description = $description;
return $this;
}
/**
* @return Collection|FAQ[]
*/
public function getFaqs(): Collection
{
return $this->faqs;
}
public function addFaq(FAQ $faq): self
{
if (!$this->faqs->contains($faq)) {
$this->faqs[] = $faq;
$faq->addArticle($this);
}
return $this;
}
public function removeFaq(FAQ $faq): self
{
if ($this->faqs->removeElement($faq)) {
$faq->removeArticle($this);
}
return $this;
}
}
FAQ.php
<?php
namespace App\Entity;
use ApiPlatform\Core\Annotation\ApiResource;
use App\Repository\FAQRepository;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping as ORM;
/**
* @ApiResource()
* @ORM\Entity(repositoryClass=FAQRepository::class)
*/
class FAQ
{
/**
* @ORM\Id
* @ORM\GeneratedValue
* @ORM\Column(type="integer")
*/
private $id;
/**
* @ORM\Column(type="string",length=255)
*/
private $description;
/**
* @ORM\ManyToMany(targetEntity=Address::class,inversedBy="faqs")
*/
private $addresses;
/**
* @ORM\ManyToMany(targetEntity=Article::class,inversedBy="faqs")
*/
private $articles;
public function __construct()
{
$this->addresses = new ArrayCollection();
$this->articles = 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 getDescription(): ?string
{
return $this->description;
}
public function setDescription(string $description): self
{
$this->description = $description;
return $this;
}
/**
* @return Collection|Address[]
*/
public function getAddresses(): Collection
{
return $this->addresses;
}
public function addAddress(Address $address): self
{
if (!$this->addresses->contains($address)) {
$this->addresses[] = $address;
}
return $this;
}
public function removeAddress(Address $address): self
{
$this->addresses->removeElement($address);
return $this;
}
/**
* @return Collection|Article[]
*/
public function getArticles(): Collection
{
return $this->articles;
}
public function addArticle(Article $article): self
{
if (!$this->articles->contains($article)) {
$this->articles[] = $article;
}
return $this;
}
public function removeArticle(Article $article): self
{
$this->articles->removeElement($article);
return $this;
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。