Учение о том, как объединить неполные данные - PullRequest
3 голосов
/ 28 апреля 2019

Я создаю REST API с Symfony 4.2 и Doctrine в качестве ORM, подключенного к базе данных MySQL. Я получаю данные в JSON, десериализую их с помощью JMSSerializer и использую функцию слияния доктрины, чтобы присоединить их. Как я могу объединить сущность, полученную из JSON, с уже существующей сущностью, обновляя только указанные поля в JSON?

Событие сущности

<?php

namespace App\Entity;

use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping as ORM;
use JMS\Serializer\Annotation\Type;

/**
 * Event
 *
 * @ORM\Table(name="Event", indexes={@ORM\Index(name="Organiser", columns={"Organiser"})})
 * @ORM\Entity
 */
class Event
{
    /**
     * @var int
     *
     * @ORM\Column(name="ID", type="integer", nullable=false)
     * @ORM\Id
     * @ORM\GeneratedValue
     * @Type("int")
     */
    private $id;

    /**
     * @var \Invited
     * 
     * @ORM\OneToMany(targetEntity="Invited",mappedBy="event",cascade={"persist","merge","remove"})
     * @Type("ArrayCollection<App\Entity\Invited>")
     */
    private $guests;

    /**
     * @var string
     *
     * @ORM\Column(name="Title", type="string", length=255, nullable=false)
     * @Type("string")
     */
    private $title;

    /**
     * @var \DateTime
     *
     * @ORM\Column(name="StartDate", type="datetime", nullable=false)
     * @Type("DateTime")
     */
    private $startdate;

    /**
     * @var \DateTime|null
     *
     * @ORM\Column(name="EndDate", type="datetime", nullable=true)
     * @Type("DateTime")
     */
    private $enddate;

    /**
     * @var string
     *
     * @ORM\Column(name="Place", type="string", length=255, nullable=false)
     * @Type("string")
     */
    private $place;

    /**
     * @var string|null
     *
     * @ORM\Column(name="ImagePath", type="string", length=255, nullable=true)
     * @Type("string")
     */
    private $imagepath;

    /**
     * @var \User
     *
     * @ORM\ManyToOne(targetEntity="User",cascade={"persist"})
     * @ORM\JoinColumns({
     *   @ORM\JoinColumn(name="Organiser", referencedColumnName="ID")
     * })
     * @Type("App\Entity\User")
     */
    private $organiser;
?>

десериализация

 $json = $request->getContent();
        $serializer = SerializerBuilder::create()->build();
        $event = $serializer->deserialize($json,'App\Entity\Event','json');

Слияние

  $feedback = $this->em->merge($newEvent);
  $this->em->flush();

Ожидаемые и фактические результаты:

Если у меня есть уже существующее и прикрепленное событие, например:

{
 id:1,
 title: 'oldTitle',
 startDate: oldDate,
 place: 'oldPlace',
...
}

И я получаю:

{
 id:1,
 title: 'newTitle'
}

Ожидаемый результат:

{
 id:1,
 title: 'newTitle',
 startDate: oldDate,
 place: 'oldPlace',
...
}

Фактический результат при просмотре базы данных:

{
 id:1,
 title: 'newTitle',
 startDate: null,
 place: null,
...
}

Как мне добиться этого эффективным способом?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...