【发布时间】:2021-06-09 15:49:02
【问题描述】:
我得到了错误:
Nested documents for attribute "players" are not allowed. Use IRIs instead.
所以,我知道我需要使用序列化程序创建组。
我在做什么;我使用 symfony 5、教义(SQLite)和 api-platform。
我正在制作游戏,而游戏需要玩家。所以当我在数据库中添加游戏时,我也想添加玩家。两者都有自己的实体; Game.php 和 Player.php(也在实体文件夹中)。
由于某种原因,我无法正确链接 2 个实体,我做错了什么?
我使用 API 平台来执行这个 json;
{
"active": 0,
"hints": 0,
"players": [
{
"game": 1,
"nickname": "string",
"code": "string"
}
],
"price": "345",
"gameMap": "/api/game_maps/2",
"uidGame": "4",
"teamName": "3",
"secretKey": "fdgfdg",
"startTime": "2021-03-11T11:38:45.923Z",
"lastActionOnTime": "2021-03-11T11:38:45.923Z",
"endTime": "2021-03-11T11:38:45.923Z",
"penaltyTime": "g",
"testGame": 0
}
游戏实体:
<?php
namespace App\Entity;
use App\Repository\GameRepository;
use ApiPlatform\Core\Annotation\ApiResource;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Serializer\Annotation\Groups;
/**
* @ApiResource(normalizationContext={ "groups": {"boost"} })
* @ORM\Entity(repositoryClass=GameRepository::class)
*/
class Game
{
/**
* @ORM\Id
* @ORM\GeneratedValue
* @ORM\Column(type="integer")
* @Groups({"boost"})
*/
private $id;
/**
* @ORM\ManyToOne(targetEntity=GameMap::class, inversedBy="games", cascade={"persist"})
* @ORM\JoinColumn(nullable=false)
* @Groups({"boost"})
*/
private $game_map;
/**
* @ORM\Column(type="string", length=255)
*/
private $uid_game;
/**
* @ORM\Column(type="string", length=255)
*/
private $team_name;
/**
* @ORM\Column(type="string", length=255)
*/
private $secret_key;
/**
* @ORM\Column(type="datetime")
*/
private $start_time;
/**
* @ORM\Column(type="datetime")
*/
private $last_action_on_time;
/**
* @ORM\Column(type="smallint")
*/
private $active;
/**
* @ORM\Column(type="datetime")
*/
private $end_time;
/**
* @ORM\Column(type="integer")
*/
private $hints;
/**
* @ORM\Column(type="bigint")
*/
private $penalty_time;
/**
* @ORM\Column(type="json")
*/
private $progress = [];
/**
* @ORM\Column(type="string", length=255)
*/
private $price;
/**
* @ORM\Column(type="smallint")
*/
private $test_game;
/**
* @ORM\OneToMany(targetEntity=Player::class, mappedBy="game", orphanRemoval=true, cascade={"persist"})
* @Groups({"boost"})
*/
private $players;
/**
* @ORM\OneToMany(targetEntity=UserGame::class, mappedBy="game", orphanRemoval=true, cascade={"persist"})
* @Groups({"boost"})
*/
private $userGames;
}
还有玩家实体:
<?php
namespace App\Entity;
use App\Repository\PlayerRepository;
use ApiPlatform\Core\Annotation\ApiResource;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Serializer\Annotation\Groups;
/**
* @ApiResource()
* @ORM\Entity(repositoryClass=PlayerRepository::class)
*/
class Player
{
/**
* @ORM\Id
* @ORM\GeneratedValue
* @ORM\Column(type="integer")
* @Groups({"boost"})
*/
private $id;
/**
* @ORM\ManyToOne(targetEntity=Game::class, inversedBy="players")
* @ORM\JoinColumn(nullable=false)
* @Groups({"boost"})
*/
private $game;
/**
* @ORM\Column(type="string", length=255)
* @Groups({"boost"})
*/
private $nickname;
/**
* @ORM\Column(type="string", length=255)
* @Groups({"boost"})
*/
private $code;
}
【问题讨论】:
-
这个答案有帮助吗? stackoverflow.com/a/56499410/1166880
-
很遗憾,我已经试过了:(
标签: symfony serialization deserialization json-deserialization api-platform.com