原始Github上問題的工作:https://github.com/zfcampus/zf-apigility-doctrine/issues/215與相關/嵌入實體
在代碼連接API,包括三個實體各自的服務:地點,產品和位置。
地點與地點一個多對一關係
/**
* @ORM\ManyToOne(targetEntity="Db\Entity\Location", cascade={"persist"})
* @ORM\JoinColumn(name="location_id", referencedColumnName="id")
*
* @var Db\Entity\Location $location
*/
protected $location;
public function getLocation() {...}
public function setLocation($location) {...}
場館與產品多對多關係
/**
* @ORM\ManyToMany(targetEntity="Db\Entity\Product", inversedBy="venues", cascade={"persist"})
* @ORM\JoinTable(name="products_venues")
**/
protected $products;
public function getProducts() {...}
public function setProducts($products) {...}
public function addProduct(Product $product)
{
$product->addVenue($this);
$this->products[] = $product;
return $this;
}
和產品有場地多對多關係現在
/**
* @ORM\ManyToMany(targetEntity="Db\Entity\Venue", mappedBy="products", cascade={"persist"})
**/
protected $venues;
public function getVenues() {...}
public function setVenues($venues) {...}
public function addVenues($venue)
{
$this->venues[] = $venue;
return $this;
}
,我有兩個問題在這裏: 1)我可以創建一個新的場地像這樣的位置信息:
POST /venues
{
.
.
.
"location":{
"address":"123 Fake Street",
"city":"cityTest",
"country":"CountryTest",
"postalCode":"12345"
}
}
和一個新的場地是一個新的位置註冊表中創建,並同時看到正確鏈接,當我剛剛創建的場所。 當我剛剛創建了場地Id時,我發現位置對象的ID在_embedded中,但如果我需要編輯該地址並將場地1與位置2相連接,而不是最初創建的位置1,該怎麼辦?
其次,我無法複製這個過程,產品創建和鏈接產品與場地在同一個POST調用中創建最後一個。 下界想出瞭如何將現有產品添加到特定場所的產品集合中。 那麼,哪種方式更合適? (「1次調用創建並鏈接它們」與「多次創建調用+修補程序調用將它們鏈接在一起」)以及我需要在Apigility + Doctrine中使它們發生的事情?
更新7月20日:
Woo !!這是有趣的發現。爲了更新特定場地的位置,我必須在Venues服務中添加一個新的「位置」字段。 有了這個,我可以將一個位置對象作爲一個額外的屬性和/ Venues所需的屬性一起發佈。或者通過添加location: {"id" : 123}
來指定ID(這也適用於PATCH,這正是我一直在尋找的,太棒了!)。但是我意識到沒有實際的驗證來檢查具有指定Id的位置實際上是否存在。如果沒有找到,那麼新場地將被鏈接到「空」位置。 :皺眉:
所以,在那之後,我看到了包含Apigility Doctrine驗證器。 :smile:ZF\Apigility\Doctrine\Server\Validator\ObjectExists
驗證我發送的對象實際上存在於數據庫中。 Yeeyyy!我所要做的就是將其添加爲「位置」字段的驗證器,並根據https://github.com/doctrine/DoctrineModule/blob/master/docs/validator.md entity_class = Db\Entity\Location
指定兩個選項,以便驗證程序知道我要驗證的實體以及fields = id
,這與驗證標準相似。
現在,當我嘗試發佈場地時,我需要使用"location": {"id":123}
指定位置。這也與PATCH合作。當找不到指定ID的位置時,我會收到一個很棒的錯誤消息,這很好。如果沒有提供身份證,則有500人(我想,時間上有一個問題,我猜...)。
現在,我一直試圖找到如何將對象添加到實體集合。 (比如,將產品添加到特定場所)。我試圖將「產品」字段添加到場館服務中,但沒有奏效。我一直在收集場地中沒有任何產品。 這是我正在努力修補程序:
PATCH /venues/1
{
...
"products":[
{"id": 5}
]
...
}
在這個任何想法?
是,它使一個很大的意義的REST API,以這樣的工作,但在這種情況下,我在我的項目中使用Apigility與Doctrine模塊(zf-apigility-doctrine),我無法找到實現它的方式那個。 我可以創建Venue和Address,也可以通過在Venue字段+位置執行POST /場所來鏈接它們。我只是無法找到執行PATCH /場館/ 2 _ {「location」:123} _ 的方法有意義嗎? – arthos4g
你的'PATCH /場館/ {id}'端點是否有'位置'字段? – Mark
在我看來,一旦你在你的服務中創建了一個'/ location'端點,然後在你的'/ venues'端點上添加一個'location'字段,那麼一切都應該起作用。 ***注意:***不要忘記刪除舊的'location'字段,因爲那個人需要一個'array'而不是一個整數, – Mark