Я создаю 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,
...
}
Как мне добиться этого эффективным способом?