Php Symfony/API平台-多对多关系仅以一种方式工作

Php Symfony/API平台-多对多关系仅以一种方式工作,php,symfony,doctrine,many-to-many,api-platform.com,Php,Symfony,Doctrine,Many To Many,Api Platform.com,我正在从事一个项目,在这个项目中,我需要将“文章”和“地址”实体与“FAQ”实体相关联。所以我在我的Faq实体中写下了这两个关系 /** * @ORM\ManyToMany(targetEntity=Article::class, inversedBy="faqs") * @Groups({"api_backend"}) * @MaxDepth(1) */ private $article; /** * @ORM\ManyToMany(targ

我正在从事一个项目,在这个项目中,我需要将“文章”和“地址”实体与“FAQ”实体相关联。所以我在我的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;
并将这些属性添加到my adrese.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;
<?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实体时,就可以看到它

/**
 * @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;

有人知道吗?我真的被困在这里了

编辑:我在这个项目上安装了一个遗留的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;
    }
}

我不确定,但可能是您忘了保存子地址实体?您还可以尝试添加注释cascade=“persist”。不管怎样,在调试过程中,这似乎是您问题的答案。这种行为的原因太多了。需要查看完整的源代码,或者至少控制您所说的持久化chil地址实体是什么意思?我试图关联的地址是数据库中的现有项。关于级联注释,我应该在哪里添加它?我没有使用任何控制器、规范化器或任何类来扩展api平台,您希望看到哪些文件。编辑:我尝试在这两个属性上添加cascade={“persist”},但没有任何效果:/对于我的项目,为了使它按我想要的方向工作,我反转了mappedBy和invertedBy
<?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;
    }
}
<?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;
    }
}
<?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 $title;

    /**
     * @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;
    }
}