API平台,在MongoDB中使用EmbedOne发布对象

时间:2019-09-16 14:52:28

标签: php mongodb symfony api-platform.com

我正在尝试将数据保存在MongoDB中。到目前为止有效。接下来,我想通过@ODM \ EmbedOne / @EmbeddedDocument在此记录中保存一个对象。我在做什么错了?

API平台错误:

  

“ hydra:description”:“ \” device \“属性的类型必须为\” object \“,指定为\” string \“。”

  

“ hydra:description”:“语法错误”

  

“ hydra:description”:“ \”设备\“属性的类型必须为\”对象\“,指定的\”数组\“。”

api平台发布示例:

{
  "name": "AAA",
  "nameShort": "AA",
  "lastUpdate": 22332340,
  "device": "{"deviceId":200, "name":"Test"}"
}

现在有一点代码:

<?php
// api/src/Document/Vessel.php

namespace App\Document;

use ApiPlatform\Core\Annotation\ApiResource;
use Doctrine\ODM\MongoDB\Mapping\Annotations as ODM;
use Doctrine\ODM\MongoDB\Mapping\Annotations\EmbedOne;
use Symfony\Component\Validator\Constraints as Assert;

/**
 * @ApiResource(iri="http://schema.org/Vessel")
 *
 * @ODM\Document
 */
class Vessel
{
    /**
     * @ODM\Id(strategy="INCREMENT", type="integer")
     */
    private $id;

    /**
     * @ODM\Field(type="string")
     * @Assert\NotBlank
     * @Assert\Type(type="string")
     */
    public $name;

    /**
     * @ODM\Field(type="string")
     * @Assert\NotBlank
     * @Assert\Type(type="string")
     */
    public $nameShort;

    /**
     * @ODM\Field(type="integer")
     * @Assert\NotBlank
     * @Assert\Type(type="integer")
     */
    public $lastUpdate;

    /**
     * @EmbedOne(
     *     discriminatorField="type",
     *     discriminatorMap={
     *         "device"="Document\Device"
     *     },
     *     defaultDiscriminatorValue="device",
     *     nullable="true"
     * )
     */
    public $device;

    public function getId(): ?int
    {
        return $this->id;
    }
}
<?php

namespace App\Document;

use Doctrine\ODM\MongoDB\Mapping\Annotations\EmbeddedDocument;

/**
 * @EmbeddedDocument
 */
class Device
{
    /**
     * @var int
     */
    public $deviceId;

    /**
     * @var string
     */
    public $name;

    /**
     * @return int
     */
    public function getDeviceId(): int
    {
        return $this->deviceId;
    }

    /**
     * @param int $deviceId
     */
    public function setDeviceId(int $deviceId): void
    {
        $this->deviceId = $deviceId;
    }

    /**
     * @return string
     */
    public function getName(): string
    {
        return $this->name;
    }

    /**
     * @param string $name
     */
    public function setName(string $name): void
    {
        $this->name = $name;
    }
}

我希望有人能帮忙吗?

1 个答案:

答案 0 :(得分:0)

我认为您只需要为“设备”值而不是您正在使用的字符串发送一个对象:

  "name": "AAA",
  "nameShort": "AA",
  "lastUpdate": 22332340,
  "device": {"deviceId":200, "name":"Test"}