2016-03-09 11 views
0

У меня есть два объекта многие-ко-многим ассоциации:запрос POST на многие-ко-многим ассоциации

class User extends BaseUser 

и

class Calendar 
{ 
    /** 
    * @var integer 
    * 
    * @ORM\Column(name="id", type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    private $id; 

    /** 
    * @var string 
    * 
    * @ORM\Column(name="name", type="text") 
    */ 
    private $name; 

    /** 
    * @var string 
    * 
    * @ORM\Column(name="view", type="text") 
    * @Assert\Choice(choices = {"work week", "week", "month", "year"}, message = "Choose a valid view.") 
    */ 
    private $view; 

    /** 
    * @ManyToMany(targetEntity="AppBundle\Entity\User") 
    * @JoinTable(name="calendars_publishers", 
    *  joinColumns={@JoinColumn(name="calendar_id", referencedColumnName="id")}, 
    *  inverseJoinColumns={@JoinColumn(name="publisher_id", referencedColumnName="id", unique=true)} 
    *  ) 
    */ 
    private $publishers; 

    public function __construct() 
    { 
     $this->publishers = new \Doctrine\Common\Collections\ArrayCollection(); 
    } 

    /** 
     * Add publishers 
     * 
     * @param \AppBundle\Entity\User $publishers 
     * @return Calendar 
     */ 
     public function addPublisher(\AppBundle\Entity\User $publishers) 
     { 
      $this->publishers[] = $publishers; 

      return $this; 
     } 

     /** 
     * Remove publishers 
     * 
     * @param \AppBundle\Entity\User $publishers 
     */ 
     public function removePublisher(\AppBundle\Entity\User $publishers) 
    { 
     $this->publishers->removeElement($publishers); 
     } 
} 

И когда я делаю запрос POST на моем REST API (http://localhost:8000/calendars) с телом:

{ 
    "name": "My calendar", 
    "view": "week", 
    "publishers": [ 
    "https://stackoverflow.com/users/1", 
    "https://stackoverflow.com/users/2" 
    ] 
} 

у меня есть ответ:

{ 
    "@context": "/contexts/Calendar", 
    "@id": "/calendars/3", 
    "@type": "Calendar", 
    "name": "My calendar", 
    "view": "week", 
    "publishers": [] 
} 

Итак, как вы видите, мой объект хорошо записан, но я не могу поместить некоторых пользователей в publishers. У вас есть идея?

Я использую связки:

  • DunglasApiBundle
  • NelmioApiDocBundle
  • NelmioCorsBundle
  • FOSHttpCacheBundle
  • FOSUserBundle
  • LexikJWTAuthenticationBundle

с api-platform.

ответ

1

Вы должны добавить addPublisher(User $publisher) и removePublisher(User $publisher) методы.

Платформа API внутренне использует компонент Symfony PropertyAccess, и этот компонент требует, чтобы такие методы имели доступ к частной собственности.

+0

У меня уже есть такие методы, как у меня есть редактирование в моем посте, чтобы добавить его. – gsoub

+0

Можете ли вы попытаться добавить метод setPublishers (не удаляя сумматоры и удалители)? –

+0

Да, это работает! Спасибо. – gsoub

0

Похоже, вы должны указать fetch="EAGER" в отношениях, чтобы он всегда получал связанные объекты.

см http://doctrine-orm.readthedocs.org/projects/doctrine-orm/en/latest/reference/annotations-reference.html#manytoone (а также следующий абзац)

и некоторые хорошая информация здесь: http://www.uvd.co.uk/blog/some-doctrine-2-best-practices/

+0

Указать 'fetch =" EAGER "' ничего не делать, я не знаю, почему. Поэтому я использую [Сериализационные группы и отношения] (https://api-platform.com/doc/1.0/api-bundle/serialization-groups-and-relations), и он работает. Я не знаю, насколько это самый чистый способ. – gsoub