POST 请求多对多关联
POST request on many-to-many association
我有两个具有多对多关联的实体:
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);
}
}
当我对我的 REST API (http://localhost:8000/calendars) 和正文执行 POST 请求时:
{
"name": "My calendar",
"view": "week",
"publishers": [
"/users/1",
"/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.
听起来您应该在关系中指定 fetch="EAGER"
以便它始终获得相关对象。
这里还有一些有用的信息:http://www.uvd.co.uk/blog/some-doctrine-2-best-practices/
您应该添加 addPublisher(User $publisher)
和 removePublisher(User $publisher)
方法。
API 平台内部使用 Symfony PropertyAccess 组件,该组件需要这样的方法才能访问私有 属性.
我有两个具有多对多关联的实体:
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);
}
}
当我对我的 REST API (http://localhost:8000/calendars) 和正文执行 POST 请求时:
{
"name": "My calendar",
"view": "week",
"publishers": [
"/users/1",
"/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.
听起来您应该在关系中指定 fetch="EAGER"
以便它始终获得相关对象。
这里还有一些有用的信息:http://www.uvd.co.uk/blog/some-doctrine-2-best-practices/
您应该添加 addPublisher(User $publisher)
和 removePublisher(User $publisher)
方法。
API 平台内部使用 Symfony PropertyAccess 组件,该组件需要这样的方法才能访问私有 属性.