title: How to save a Nested Relation with Entity on API Platform
body: <p>I have two entities, <strong>Question</strong> and <strong>Alternative</strong> where Question has a OneToMany relation with Alternative and I'm trying to send a JSON with a nested document of <strong>Alternative</strong> on it via POST to <strong>Question</strong> API Platform.</p>
  
  <p>The API Platform returns that error below :</p>
  
  <pre><code>Nested documents for "alternatives" attribute are not allowed. Use IRIs instead.
  </code></pre>
  
  <p>Searching about it I've found some people saying that is only possible using IRIs and some other people saying that is possible to use Denormalization and Normalization contexts to solve this problem but I can't find some example or tutorial about it.</p>
  
  <p><strong>TL;DR;</strong></p>
  
  <p>Is there a way to send a nested relation into an entity POST on API Platform without using IRIs?</p>
  
  <p><strong>UPDATE:</strong></p>
  
  <p>As asked, please see below the two mappings of Question and Alternative entities.</p>
  
  <p><strong>Question</strong></p>
  
  <pre><code>&lt;?php
  
  namespace App\Entity;
  
  use ApiPlatform\Core\Annotation\ApiResource;
  use DateTimeInterface;
  use Doctrine\Common\Collections\ArrayCollection;
  use Doctrine\Common\Collections\Collection;
  use Doctrine\ORM\Mapping as ORM;
  use Symfony\Component\Validator\Constraints as Assert;
  
  /**
   * @ORM\Entity(repositoryClass="App\Repository\QuestionRepository")
   * @ApiResource()
   */
  class Question implements CreatedAtEntityInterface, UpdatedAtEntityInterface
  {
      /**
       * @ORM\Id()
       * @ORM\GeneratedValue()
       * @ORM\Column(type="integer")
       */
      private $id;
  
      /**
       * @ORM\ManyToOne(targetEntity="App\Entity\Token", inversedBy="questions")
       * @ORM\JoinColumn(nullable=false)
       * @Assert\NotBlank()
       */
      private $token;
  
      /**
       * @ORM\ManyToOne(targetEntity="App\Entity\Question", inversedBy="question_versions")
       */
      private $question;
  
      /**
       * @ORM\OneToMany(targetEntity="App\Entity\Question", mappedBy="question")
       */
      private $question_versions;
  
      /**
       * @ORM\Column(type="integer")
       * @Assert\NotBlank()
       */
      private $version;
  
      /**
       * @ORM\Column(type="string", length=100)
       * @Assert\Length(max="100")
       * @Assert\NotBlank()
       *
       */
      private $name;
  
      /**
       * @ORM\Column(type="integer")
       * @Assert\NotBlank()
       */
      private $type;
  
      /**
       * @ORM\Column(type="text", length=65535)
       * @Assert\NotBlank()
       * @Assert\Length(max="65535")
       */
      private $enunciation;
  
      /**
       * @ORM\Column(type="string", length=255, nullable=true)
       * @Assert\Length(max="255")
       */
      private $material;
  
      /**
       * @ORM\Column(type="text", length=65535, nullable=true)
       * @Assert\Length(max="65535")
       */
      private $tags;
  
      /**
       * @ORM\Column(type="boolean")
       * @Assert\NotNull()
       */
      private $public;
  
      /**
       * @ORM\Column(type="boolean")
       * @Assert\NotNull()
       */
      private $enabled;
  
      /**
       * @ORM\Column(type="datetime")
       * @Assert\DateTime()
       */
      private $createdAt;
  
      /**
       * @ORM\Column(type="datetime")
       * @Assert\DateTime()
       */
      private $updatedAt;
  
      /**
       * @ORM\OneToMany(targetEntity="App\Entity\Alternative", mappedBy="question")
       */
      private $alternatives;
  
      /**
       * @ORM\OneToMany(targetEntity="App\Entity\QuestionProperty", mappedBy="question")
       */
      private $properties;
  
      /**
       * @ORM\OneToMany(targetEntity="App\Entity\QuestionAbility", mappedBy="question")
       */
      private $abilities;
  
      /**
       * @ORM\OneToMany(targetEntity="QuestionCompetency", mappedBy="question")
       */
      private $competencies;
  }
  </code></pre>
  
  <p><strong>Alternative</strong></p>
  
  <pre><code>&lt;?php
  
  namespace App\Entity;
  
  use ApiPlatform\Core\Annotation\ApiResource;
  use DateTimeInterface;
  use Doctrine\Common\Collections\ArrayCollection;
  use Doctrine\Common\Collections\Collection;
  use Doctrine\ORM\Mapping as ORM;
  use Symfony\Component\Validator\Constraints as Assert;
  
  /**
   * @ORM\Entity(repositoryClass="App\Repository\AlternativeRepository")
   * @ORM\Table(name="alternatives")
   * @ApiResource()
   */
  class Alternative implements CreatedAtEntityInterface, UpdatedAtEntityInterface
  {
      /**
       * @ORM\Id()
       * @ORM\GeneratedValue()
       * @ORM\Column(type="integer")
       */
      private $id;
  
      /**
       * @ORM\ManyToOne(targetEntity="App\Entity\Question", inversedBy="alternatives")
       * @ORM\JoinColumn(nullable=false)
       * @Assert\NotBlank()
       */
      private $question;
  
      /**
       * @ORM\Column(type="text", length=65535)
       * @Assert\NotBlank()
       * @Assert\Length(max="65535")
       */
      private $enunciation;
  
      /**
       * @ORM\Column(type="datetime")
       * @Assert\DateTime()
       */
      private $createdAt;
  
      /**
       * @ORM\Column(type="datetime")
       * @Assert\DateTime()
       */
      private $updatedAt;
  
      /**
       * @ORM\OneToMany(targetEntity="App\Entity\AlternativeProperty", mappedBy="alternatives")
       */
      private $properties;
  }
  </code></pre>