Допустим, у меня есть объект с именем User:
class User implements UserInterface
/**
* @ORM\Id()
* @ORM\GeneratedValue()
* @ORM\Column(type="integer")
*/
private $id;
/**
* @ORM\Column(type="string", length=255, nullable=false)
*/
private $username;
/**
* @ORM\OneToOne(targetEntity="App\Entity\Address", cascade={"persist", "remove"})
* @ORM\JoinColumn(nullable=false)
*/
private $address;
Поле адреса является отношением OneToOne к объекту адреса:
class Address
{
/**
* @ORM\Id()
* @ORM\GeneratedValue()
* @ORM\Column(type="integer")
*/
private $id;
/**
* @ORM\Column(type="string", length=255)
*/
private $street;
/**
* @ORM\Column(type="string", length=255)
*/
private $name;
И у меня есть контроллер для обновленияпользователь и его адрес:
...
public function putUserSelf(Request $request)
{
$em = $this->getDoctrine()->getManager();
$user = $this->getUser();
$encoders = array(new JsonEncoder());
$normalizers = array(new ObjectNormalizer(null, null, null, new ReflectionExtractor()));
$serializer = new Serializer($normalizers, $encoders);
$user = $serializer->deserialize($request->getContent(), User::class, "json", ['deep_object_to_populate' => $user]);
$em->persist($user);
$em->flush();
Теоретически теперь у меня должна быть возможность передать json, подобный этому:
{
"username": "foo",
"address": {"name": "bar"}
}
, чтобы обновить мою сущность. Но проблема в том, что я получаю ошибку sql:
An exception occurred while executing 'INSERT INTO address (street, name) VALUES (?, ?)' with params [null, "bar"]:
SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'street' cannot be null
Похоже, слияние сущностей не сработало.