当前位置: 首页 > 知识库问答 >
问题:

API平台:规范化和反规范化继承映射原则实体

浦德明
2023-03-14

我有一个名为提交内容的实体类型。提交与 SurveyData 实体类型具有一对一关系。

SurveyData 实体实际上是一个映射的超类。它最终将有几十个用于存储来自不同调查数据的实体子类。

根据文档,我创建了一个自定义规范化器,它基于类型键处理非规范化:

  public function denormalize($data, string $type, string $format = null, array $context = [])
  {
    if ($type === 'App\Entity\SurveyData\SurveyData') {
      $class = 'App\Entity\SurveyData\\' . $data['type'];
      $context['resource_class'] = $class;
    }

    $context[self::ALREADY_CALLED] = true;

    return $this->denormalizer->denormalize($data, 'App\Entity\SurveyData\\' . $data['type'], $format, $context);
  }

有了这个,我可以完美地创建一个嵌入了SurveyData的新提交。下面是我发送给POST请求的JSON示例:

{
    "facility": "/api/facilities/1",
    "survey": "/api/surveys/monthly_totals",
    "dateDetail": "Q1 2020",
    "surveyData": {
      "type": "MonthlyTotals",
      "num_deliveries": 50,
      "num_cesarean": 30,
      "num_epidural_anesthesia": 15
    },
    "created": "2020-08-14T18:59:49.218Z",
    "updated": "2020-08-14T18:59:49.218Z",
    "user": "brian",
    "status": "complete"
}

但是,当我通过 GET 获取集合或单个提交实体时,API 平台返回的响应忽略了将 @id 属性添加到嵌入式调查响应中。我不确定这是否是因为它是一个不能为空的一对一,所以它在内部被跟踪:

{
            "@id": "/api/submissions/2",
            "@type": "Submission",
            "id": 2,
            "facility": "/api/facilities/1",
            "survey": "/api/surveys/monthly_totals",
            "dateDetail": "Q1 2020",
            "created": "2020-08-14T18:59:49+00:00",
            "updated": "2020-08-14T18:59:49+00:00",
            "user": "brian",
            "status": "complete",
            "surveyData": {
                "num_deliveries": 50,
                "num_cesarean": 30,
                "num_epidural_anesthesia": 15
            }
        }

真正的问题是PUTPATCH请求失败。

对于< code>PATCH请求,我可以更新父提交实体中的字段。但是,如果我发送以下请求,Submission和SurveyData实体将从数据库中删除,并且我会从API中得到以下错误:

“实体应用\\实体\\Submission@000000002116ebc30000000012ca4827不受管理。如果实体从数据库中获取或通过 EntityManager#persist 注册为新实体,则对其进行管理“,

整个反应的要点包括一个痕迹:https://gist.github.com/brianV/c32661186c91b49b013017dde77d5d4a

下面是一个触发错误的< code>PATCH请求的示例:

{
    "user": "brian",
    "surveyData": {
        "type": "MonthlyTotals",
        "num_deliveries": 100
    }
}

每个PUT请求也会发生这种情况(其中我包括了整个替换提交实体)。

简单的Symfony

根据注释请求,以下是提交实体注释:

/**
 * @ApiResource(
 *   normalizationContext={"groups"={"submission"}},
 *   denormalizationContext={"groups"={"submission"}},
 *   itemOperations={
 *     "get"={
 *       "method"="GET",
 *       "access_control"="is_granted('view', object)",
 *     },
 *     "put", "patch", "delete",
 *   },
 * )
 * @ORM\Entity(repositoryClass="App\Repository\SubmissionRepository")
 * @CustomAssert\SubmissionDataIsValid
 */
class Submission
{
    /**
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     * @Groups({"submission"})
     */
    private $id;

    /**
     * @ORM\ManyToOne(targetEntity="App\Entity\Facility")
     * @ORM\JoinColumn(nullable=false)
     * @Groups({"submission"})
     */
    private $facility;

    /**
     * @ORM\ManyToOne(targetEntity="App\Entity\Patient", inversedBy="submissions")
     * @Groups({"submission"})
     */
    private $patient;

    /**
     * @ORM\Column(type="string", length=255)
     * @Groups({"submission"})
     */
    private $survey;

    /**
     * @ORM\Column(type="string", length=255, nullable=true)
     * @Groups({"submission"})
     */
    private $dateDetail;

    /**
     * @ORM\Column(type="datetime")
     * @Assert\Type("\DateTimeInterface")
     * @Groups({"submission"})
     */
    private $created;

    /**
     * @ORM\Column(type="datetime")
     * @Assert\Type("\DateTimeInterface")
     * @Groups({"submission"})
     */
    private $updated;

    /**
     * @ORM\Column(type="string", length=255)
     * @Groups({"submission"})
     */
    private $user;

    /**
     * @ORM\Column(type="string", length=255)
     * @Groups({"submission"})
     */
    private $status;

    /**
     * @ORM\OneToOne(targetEntity="App\Entity\SurveyData\SurveyData", inversedBy="submission", cascade={"persist", "remove"}, orphanRemoval=true, fetch="EAGER")
     * @Groups({"submission"})
     */
    private $surveyData;

提前感谢任何帮助!

共有1个答案

曹渝
2023-03-14

确保使用api_platform.jsonld.normalizer对SurveyData属性进行了规范化。当您使用提交URL时,项目服务。

我假设您已经按照这些步骤嵌入了您的对象?嗯,正如这里所描述的,因为你没有在你的嵌入对象中提供一个< code>@id属性,Api-Platform认为你在推一个新的对象,而不是编辑当前的对象,这就是为什么doctrine大叫(你的错误消息):这个新对象没有注册。

自动注册这个新对象的最简单方法是在提交::$调查数据属性上添加层叠={"持续"}注释属性:

class Submission
{
    /**
     * @OneToOne(targetEntity="App\Entity\SurveyData", cascade={"persist"})
     */
    private $surveyData,
}

但您也可以使用EntityManagerInterface::persist()方法。

注意:我不确定PATCH方法是否与嵌入式对象完全兼容,我记得github上的一些问题。

 类似资料:
  • 游戏创建规范 游戏上线前你需要提供软件著作权、版号申请证明(若涉及支付道具功能)、回执或者受理截图;如果游戏软件著作权有对外授权的,你需要向腾讯提供完整、真实、有效的授权文件,如果授权方允许多个主体同时提交、运营游戏,腾讯以先提交者为准。 如果你需要创建游戏,请根据游戏具体情况选择1~3种游戏类型。 游戏每次更新的玩法需要同步在游戏更新说明中写明; 游戏包控制在5M以内,最大不超过10M; 道具和

  • 在web应用部署描述符中,以下语法用于定义映射: 以‘/’字符开始、以‘/*’后缀结尾的字符串用于路径匹配。 以‘*.’开始的字符串用于扩展名映射。 空字符串“”是一个特殊的URL模式,其精确映射到应用的上下文根,即,http://host:port//请求形式。在这种情况下,路径信息是‘/’且servlet路径和上下文路径是空字符串(“”)。 只包含“/”字符的字符串表示应用的“default”

  • 我了解批次归一化有助于更快的训练,将激活转向单位高斯分布,从而解决梯度消失问题。批次规范行为在训练(使用每个批次的平均值/var)和测试时间(使用训练阶段的最终运行平均值/var)中的应用不同。 另一方面,实例归一化作为对比度归一化,如本文所述https://arxiv.org/abs/1607.08022。作者提到,输出样式化的图像不应依赖于输入内容图像的对比度,因此实例规范化有助于实现。 但是

  • 问题内容: 我目前正在滚动自己的小ORM,发现自己面临创建规范化映射的任务,以防止从数据库中多次加载同一实体。 我目前的方法是使用。该键是映射数据库实体的主键(如果是复合键,则为),其值为。 我的主要问题是如何清理地图?当不再使用某个对象时,映射中的弱引用将消失,而我只会在下一次查找时发现它(或者,如果我不再查找该对象,则永远不会)。当弱引用被清除时,我可以将它们注册为a ,然后在每次查找时检查该

  • 主要内容:范式的类型规范化是在数据库中组织数据的过程。 规范化用于最小化关系或关系集的冗余。 它还用于消除插入,更新和删除异常等不良特性。 规范化将较大的表分成较小的表,并使用关系链接它们。 普通表单用于减少数据库表中的冗余。 范式的类型 有四种类型的范式: 范式 描述说明 1NF 如果它包含原子值,则关系为第范式(1NF)。 2NF 如果它在1NF中,则关系将在2NF中,并且所有非关键属性完全依赖于主键。 3NF

  • 问题内容: 在Python中,是否存在标准化unicode字符串的标准方法,以使其仅包含可用于表示它的最简单的unicode实体? 我的意思是,一些东西,想翻译的顺序来? 查看问题出在哪里: 但现在: 当然,我可以遍历所有字符并进行手动替换等,但是效率不高,我敢肯定我会错过一半的特殊情况,并且会犯错误。 问题答案: 该模块提供一个功能,您要标准化为NFC格式: NFC或“普通形式组合”返回组成的字