php - 如何在 API 平台上保存与实体的嵌套关系
问题描述
我有两个实体,Question和Alternative ,其中 Question 与 Alternative 有 OneToMany 关系,我正在尝试通过 POST 将带有Alternative嵌套文档的 JSON 发送到Question API Platform。
API 平台在下面返回该错误:
Nested documents for "alternatives" attribute are not allowed. Use IRIs instead.
搜索它我发现有些人说只能使用 IRI 和其他人说可以使用非规范化和规范化上下文来解决这个问题,但我找不到一些关于它的示例或教程。
TL;博士;
有没有办法在不使用 IRI 的情况下将嵌套关系发送到 API 平台上的实体 POST?
更新:
如所问,请参阅下面的 Question 和 Alternative 实体的两个映射。
问题
<?php
namespace App\Entity;
use ApiPlatform\Core\Annotation\ApiResource;
use DateTimeInterface;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;
/**
* @ORM\Entity(repositoryClass="App\Repository\QuestionRepository")
* @ApiResource()
*/
class Question implements CreatedAtEntityInterface, UpdatedAtEntityInterface
{
/**
* @ORM\Id()
* @ORM\GeneratedValue()
* @ORM\Column(type="integer")
*/
private $id;
/**
* @ORM\ManyToOne(targetEntity="App\Entity\Token", inversedBy="questions")
* @ORM\JoinColumn(nullable=false)
* @Assert\NotBlank()
*/
private $token;
/**
* @ORM\ManyToOne(targetEntity="App\Entity\Question", inversedBy="question_versions")
*/
private $question;
/**
* @ORM\OneToMany(targetEntity="App\Entity\Question", mappedBy="question")
*/
private $question_versions;
/**
* @ORM\Column(type="integer")
* @Assert\NotBlank()
*/
private $version;
/**
* @ORM\Column(type="string", length=100)
* @Assert\Length(max="100")
* @Assert\NotBlank()
*
*/
private $name;
/**
* @ORM\Column(type="integer")
* @Assert\NotBlank()
*/
private $type;
/**
* @ORM\Column(type="text", length=65535)
* @Assert\NotBlank()
* @Assert\Length(max="65535")
*/
private $enunciation;
/**
* @ORM\Column(type="string", length=255, nullable=true)
* @Assert\Length(max="255")
*/
private $material;
/**
* @ORM\Column(type="text", length=65535, nullable=true)
* @Assert\Length(max="65535")
*/
private $tags;
/**
* @ORM\Column(type="boolean")
* @Assert\NotNull()
*/
private $public;
/**
* @ORM\Column(type="boolean")
* @Assert\NotNull()
*/
private $enabled;
/**
* @ORM\Column(type="datetime")
* @Assert\DateTime()
*/
private $createdAt;
/**
* @ORM\Column(type="datetime")
* @Assert\DateTime()
*/
private $updatedAt;
/**
* @ORM\OneToMany(targetEntity="App\Entity\Alternative", mappedBy="question")
*/
private $alternatives;
/**
* @ORM\OneToMany(targetEntity="App\Entity\QuestionProperty", mappedBy="question")
*/
private $properties;
/**
* @ORM\OneToMany(targetEntity="App\Entity\QuestionAbility", mappedBy="question")
*/
private $abilities;
/**
* @ORM\OneToMany(targetEntity="QuestionCompetency", mappedBy="question")
*/
private $competencies;
}
选择
<?php
namespace App\Entity;
use ApiPlatform\Core\Annotation\ApiResource;
use DateTimeInterface;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;
/**
* @ORM\Entity(repositoryClass="App\Repository\AlternativeRepository")
* @ORM\Table(name="alternatives")
* @ApiResource()
*/
class Alternative implements CreatedAtEntityInterface, UpdatedAtEntityInterface
{
/**
* @ORM\Id()
* @ORM\GeneratedValue()
* @ORM\Column(type="integer")
*/
private $id;
/**
* @ORM\ManyToOne(targetEntity="App\Entity\Question", inversedBy="alternatives")
* @ORM\JoinColumn(nullable=false)
* @Assert\NotBlank()
*/
private $question;
/**
* @ORM\Column(type="text", length=65535)
* @Assert\NotBlank()
* @Assert\Length(max="65535")
*/
private $enunciation;
/**
* @ORM\Column(type="datetime")
* @Assert\DateTime()
*/
private $createdAt;
/**
* @ORM\Column(type="datetime")
* @Assert\DateTime()
*/
private $updatedAt;
/**
* @ORM\OneToMany(targetEntity="App\Entity\AlternativeProperty", mappedBy="alternatives")
*/
private $properties;
}
解决方案
你可以尝试实现非规范化
问题:
<?php
namespace App\Entity;
use ApiPlatform\Core\Annotation\ApiResource;
use DateTimeInterface;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;
/**
* @ORM\Entity(repositoryClass="App\Repository\QuestionRepository")
* @ApiResource(
* denormalizationContext={"groups"={"post"}}
* )
*/
class Question implements CreatedAtEntityInterface, UpdatedAtEntityInterface
{
/**
* @ORM\Id()
* @ORM\GeneratedValue()
* @ORM\Column(type="integer")
*/
private $id;
/**
* @ORM\ManyToOne(targetEntity="App\Entity\Token", inversedBy="questions")
* @ORM\JoinColumn(nullable=false)
* @Assert\NotBlank()
* @Groups({"post"})
*/
private $token;
/**
* @ORM\ManyToOne(targetEntity="App\Entity\Question", inversedBy="question_versions")
* @Groups({"post"})
*/
private $question;
/**
* @ORM\OneToMany(targetEntity="App\Entity\Question", mappedBy="question")
* @Groups({"post"})
*/
private $question_versions;
/**
* @ORM\Column(type="integer")
* @Assert\NotBlank()
* @Groups({"post"})
*/
private $version;
/**
* @ORM\Column(type="string", length=100)
* @Assert\Length(max="100")
* @Assert\NotBlank()
* @Groups({"post"})
*/
private $name;
/**
* @ORM\Column(type="integer")
* @Assert\NotBlank()
* @Groups({"post"})
*/
private $type;
/**
* @ORM\Column(type="text", length=65535)
* @Assert\NotBlank()
* @Assert\Length(max="65535")
* @Groups({"post"})
*/
private $enunciation;
/**
* @ORM\Column(type="string", length=255, nullable=true)
* @Assert\Length(max="255")
* @Groups({"post"})
*/
private $material;
/**
* @ORM\Column(type="text", length=65535, nullable=true)
* @Assert\Length(max="65535")
* @Groups({"post"})
*/
private $tags;
/**
* @ORM\Column(type="boolean")
* @Assert\NotNull()
* @Groups({"post"})
*/
private $public;
/**
* @ORM\Column(type="boolean")
* @Assert\NotNull()
* @Groups({"post"})
*/
private $enabled;
/**
* @ORM\Column(type="datetime")
* @Assert\DateTime()
* @Groups({"post"})
*/
private $createdAt;
/**
* @ORM\Column(type="datetime")
* @Assert\DateTime()
* @Groups({"post"})
*/
private $updatedAt;
/**
* @ORM\OneToMany(targetEntity="App\Entity\Alternative", mappedBy="question")
* @Groups({"post"})
*/
private $alternatives;
/**
* @ORM\OneToMany(targetEntity="App\Entity\QuestionProperty", mappedBy="question")
* @Groups({"post"})
*/
private $properties;
/**
* @ORM\OneToMany(targetEntity="App\Entity\QuestionAbility", mappedBy="question")
* @Groups({"post"})
*/
private $abilities;
/**
* @ORM\OneToMany(targetEntity="QuestionCompetency", mappedBy="question")
* @Groups({"post"})
*/
private $competencies;
}
选择:
<?php
namespace App\Entity;
use ApiPlatform\Core\Annotation\ApiResource;
use DateTimeInterface;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;
/**
* @ORM\Entity(repositoryClass="App\Repository\AlternativeRepository")
* @ORM\Table(name="alternatives")
* @ApiResource()
*/
class Alternative implements CreatedAtEntityInterface, UpdatedAtEntityInterface
{
/**
* @ORM\Id()
* @ORM\GeneratedValue()
* @ORM\Column(type="integer")
*/
private $id;
/**
* @ORM\ManyToOne(targetEntity="App\Entity\Question", inversedBy="alternatives")
* @ORM\JoinColumn(nullable=false)
* @Assert\NotBlank()
* @Groups({"post"})
*/
private $question;
/**
* @ORM\Column(type="text", length=65535)
* @Assert\NotBlank()
* @Assert\Length(max="65535")
* @Groups({"post"})
*/
private $enunciation;
/**
* @ORM\Column(type="datetime")
* @Assert\DateTime()
* @Groups({"post"})
*/
private $createdAt;
/**
* @ORM\Column(type="datetime")
* @Assert\DateTime()
* @Groups({"post"})
*/
private $updatedAt;
/**
* @ORM\OneToMany(targetEntity="App\Entity\AlternativeProperty", mappedBy="alternatives")
* @Groups({"post"})
*/
private $properties;
}
现在您可以在没有 IRI 的情况下将 JSON 发送到 POST/PUT:
{
"token": "/api/tokens/1",
"question": "string",
"version": "string",
"name": "string",
"type": 0,
"enunciation": "string",
"public": true,
"enabled": true,
"alternatives": [
{
"enunciation": "String",
"createdAt": "2018-01-01 11:11:11",
"updatedAt": "2018-01-01 11:11:11"
}
]
}
推荐阅读
- c - free():释放二维指针时指针无效
- javascript - 一个变量在我的 JavaScript 工厂函数中没有得到更新
- reactjs - 在反应测试库中测试useEffect + jest
- php - MySQL 标签系统 - 如何选择与最后 N 个发布的帖子关联的所有标签?
- rust - Rust 可变迭代器问题 - 如何修复“无法推断适当的生命周期”错误?
- microsoft-edge - Microsoft Edge 商店拒绝了我的插件(搜索工具)。需要说明
- django - 无法将 CSV 文件导入 pgadmin 中的数据库
- c# - Brackeys Fps 控制器仅上下移动相机
- python - 有 numpy 有限的 argsort 吗?
- json - 我需要解析字典并更新它的值