У меня много проблем с сериализацией коллекции, из которой я удалил первый элемент.
У меня есть сущность CompaniesCollection с отношением Many2Many к сущности Company.
/**
* @ORM\ManyToMany(targetEntity="App\Entity\Company")
* @Groups({"get-by-collection-owner"})
*/
private $items;
КогдаЯ выбираю объект с этой коллекцией, я получаю элементы в виде массива из двух элементов, которые я добавил в первую очередь.Я сериализую его
{
"id": 19,
"name": "collection dummy name",
"items": [
{
"id": 431,
"name": "Company 1"
},
{
"id": 435,
"name": "Company 2"
}
],
"createdAt": "2019-03-11T13:55:43+01:00",
"updatedAt": "2019-03-11T15:48:57+01:00"
},
Затем удаляю элемент FIRST:
$collection->removeItem($companyToRemove);
$em = $this->getDoctrine()->getManager();
$em->persist($collection);
$em->persist($companyToRemove);
$em->flush();
$results = $companiesCollectionRepository->getCollections($companyLoader->getCurrentCompany());
Сериализуем результаты $ и получаем не массив из одного элемента, а объект с ключом второго элемента из предыдущегомассив элементов:
{
"id": 19,
"name": "collection dummy name",
"items": {
"1": {
"id": 435,
"name": "Company 2"
}
},
"createdAt": "2019-03-11T13:55:43+01:00",
"updatedAt": "2019-03-11T15:52:48+01:00"
},
Когда я перезагружаю страницу и выбираю этот объект, коллекция снова представляет собой массив из одного элемента, а не объект.Очевидно, Doctrine не получает новые результаты из базы данных, но возвращает данные, которые уже загружены в память.
И сериализатор, скорее всего, воспринимает этот «массив» как «объект», поскольку он не начинается с0 для ключа первого элемента массива, но с ключом 1.
Можно ли сделать этот запрос еще раз, чтобы я получил недавно сгенерированные ключи или обновил эти ключи?
РЕДАКТИРОВАТЬ:
На самом деле я, наконец, нашел простое решение для этого: обновить после сброса
$collection->removeItem($companyToRemove);
$em = $this->getDoctrine()->getManager();
$em->persist($collection);
$em->persist($companyToRemove);
$em->flush();
$em->refresh($collection);