如何解决嵌套的一对多关系未显示在 Apigility 路由中的问题



我在最新版本中使用Apigility和Doctrine时遇到问题。

我有 2 个实体:广告和应用程序在一对多双向关系上。许多应用程序可以与广告相关联,而广告具有许多应用程序。 我的表是这样创建的(外键advert_id应用程序表)。

我无法调用带有应用程序的广告路线,应用程序字段始终为空。

经过一番研究,我得出的结论是,贪婪只是不知道如何呈现嵌套集合。我读过关于水合器和一个名为 api-skeletons/zf-doctrine-hydrator 的包,它将为这些教义嵌套关系提供帮助器,但遗憾的是它与 phpro/zf-doctrine-hydration-module 的第 4 版不兼容,由于其他包和依赖项,我无法降级。

<?php
namespace FilV1Entity;
use DoctrineORMMapping as ORM;
class Applications
{
/**
* @var FilV1EntityAdverts
*
* @ORMManyToOne(targetEntity="FilV1EntityAdverts",inversedBy="applications")
* @ORMJoinColumns({
*   @ORMJoinColumn(name="author_id", referencedColumnName="id", nullable=true)
* })
*/
private $advert;
/**
* Set advert.
*
* @param FilV1EntityAdverts|null $advert
*
* @return Applications
*/
public function setAdvert(FilV1EntityAdverts $advert = null)
{
$this->advert = $advert;
return $this;
}
/**
* Get advert.
*
* @return FilV1EntityAdverts|null
*/
public function getAdvert()
{
return $this->advert;
}
}
class Adverts
{
...
/**
* @var DoctrineCommonCollectionsCollection
*
* @ORMOneToMany(targetEntity="FilV1EntityApplications", mappedBy="advert")
*/
private $applications;
/**
* Constructor
*/
public function __construct()
{
$this->applications = new DoctrineCommonCollectionsArrayCollection;
}
/**
* Add application.
*
* @param FilV1EntityApplications $application
*
* @return Adverts
*/
public function addApplication(FilV1EntityApplications $application)
{
$this->applications[] = $application;
return $this;
}
/**
* Remove application.
*
* @param FilV1EntityApplications $application
*
* @return boolean TRUE if this collection contained the specified element, FALSE otherwise.
*/
public function removeApplication(FilV1EntityApplications $application)
{
return $this->applications->removeElement($application);
}
/**
* Get applications.
*
* @return DoctrineCommonCollectionsCollection
*/
public function getApplications()
{
return ($this->applications);
}
}

当我调用应用程序的路由(例如:应用程序/1)时,它运行良好,我得到了带有广告关系的 json 对象,其中包含所有信息。所以这种关系是精心构思的。 {

id: 2,
name: "application1",
_embedded: 
{
advert: 
{
id: 1,
name: "Advert1",
applications: { },
_links: 
{
self: 
{
href: "http://localhost:8080/adverts/1"
}
}
}
}, 
_links: 
{
self: 
{
href: "http://localhost:8080/applications/2"
}
}
}

问题是当我打电话和广告路线(例如:广告/2)时。我得到了包含正确广告信息的 Json,但应用程序字段为空,只有 {}。有多个应用程序链接到广告,但它不起作用。

{
id: 2,
name: "Advert1,
applications: { },
_links: 
{
self: 
{
href: "http://localhost:8080/adverts/2"
}
}
}

通常,应用程序字段应填充代表每个应用程序的不同对象。

有没有办法克服这个问题?谢谢!

ApiSkeletons供应商包在设计上具有此功能。我和你在一起,希望它返回集合,但解决方法很简单:创建一个新策略!

  • 创建一个策略类并扩展 Doctrine 的AllowRemoveByValue策略。
  • 覆盖extract函数以返回已填充或为空的集合

就是这样。

全班:

namespace ApplicationStrategy;
use DoctrineModuleStdlibHydratorStrategyAllowRemoveByValue;
use ZFHalCollection;
class UniDirectionalToManyStrategy extends AllowRemoveByValue
{
public function extract($value)
{
return new Collection($value ?: []);
}
}

例如,您的Advert尽可能多的Applications,因此应像这样修改配置:

'doctrine-hydrator' => [
'Fil\V1\Entity\ApplicationHydrator' => [
// other config
'strategies' => [
'adverts' => ApplicationStrategyUniDirectionalToManyStrategy::class,
],
],
],

现在应该返回集合。


快速说明:这只能作为*ToMany方面的策略。

相关内容

  • 没有找到相关文章

最新更新