Чтобы сохранить внедренные сущности в одном запросе, необходимо использовать группы сериализатора и включить сохранение каскада.
Сначала примените группы сериализатора к не встроенным свойствам сущности заказа.
use Symfony\Component\Serializer\Annotation\Groups;
...
/**
* @ORM\Id()
* @ORM\GeneratedValue()
* @ORM\Column(type="integer")
* @Groups("order")
*/
private $id;
Затем примените группы к встроенным свойствам и добавьте параметры каскада:
/**
* @ORM\OneToMany(targetEntity="App\Entity\OrderDetail", mappedBy="orderId", cascade={"persist", "remove"})
* @Groups("order:order_detail")
*/
private $orderDetails;
Затем примените группы к свойствам встроенного объекта:
public class OrderDetail {
/**
* ...
* @Groups("order_detail")
*/
private $id;
...
}
И добавьте их в контекст сериализации, если выне хотите, чтобы они были внедрены при извлечении данных, вы можете удалить группы из normalizationContext
:
/**
* @ApiResource(
* normalizationContext={"groups"={"order", "order:order_detail", "order_detail"}},
* denormalizationContext={"groups"={"order", "order:order_detail", "order_detail"}}
*)
* @ORM\Entity(repositoryClass="App\Repository\OrderRepository")
*/
class Order { }
Теперь вы можете сохранить их с помощью одного запроса:
POST /orders
{
...
orderDetails: [{ "myProperty": "myValue", ... }]
}
Другой альтернативой является использование подресурса , но сначала необходимо сохранить объект заказа.