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

Zend framework 如何解决Apigility路由中未显示嵌套的一对一关系的问题,zend-framework,doctrine-orm,relationship,laminas-api-tools,Zend Framework,Doctrine Orm,Relationship,Laminas Api Tools,我在使用最新版本的灵巧和教义时遇到了问题 我有两个实体:一对多双向关系上的广告和应用程序。许多应用程序可以与广告关联,并且广告具有许多应用程序。 我的表就是这样创建的(应用程序表上的外键广告id) 我无法通过应用程序调用广告路线,应用程序字段始终为空 经过一些研究,我得出结论,apigility只是不知道如何呈现嵌套集合。我读过水合器和一个名为api skeletons/zf条令水合器的包,该包将为这些条令嵌套关系提供帮助,但遗憾的是,它与phpro/zf条令水合模块的第4版不兼容,并且由于其他

我在使用最新版本的灵巧和教义时遇到了问题

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

我无法通过应用程序调用广告路线,应用程序字段始终为空

经过一些研究,我得出结论,apigility只是不知道如何呈现嵌套集合。我读过水合器和一个名为api skeletons/zf条令水合器的包,该包将为这些条令嵌套关系提供帮助,但遗憾的是,它与phpro/zf条令水合模块的第4版不兼容,并且由于其他包和依赖性,我无法降级

<?php

namespace Fil\V1\Entity;

use Doctrine\ORM\Mapping as ORM;

class Applications
{
    /**
     * @var \Fil\V1\Entity\Adverts
     *
     * @ORM\ManyToOne(targetEntity="Fil\V1\Entity\Adverts",inversedBy="applications")
     * @ORM\JoinColumns({
     *   @ORM\JoinColumn(name="author_id", referencedColumnName="id", nullable=true)
     * })
     */
    private $advert;

    /**
     * Set advert.
     *
     * @param \Fil\V1\Entity\Adverts|null $advert
     *
     * @return Applications
     */
    public function setAdvert(\Fil\V1\Entity\Adverts $advert = null)
    {
        $this->advert = $advert;

        return $this;
    }

    /**
     * Get advert.
     *
     * @return \Fil\V1\Entity\Adverts|null
     */
    public function getAdvert()
    {
        return $this->advert;
    }
}
当我调用应用程序的路由(例如:Applications/1)时,它工作得非常好,我得到了正确的json对象和广告关系,以及所有信息。因此,这种关系是经过深思熟虑的。 {

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

{
    id: 2,
    name: "Advert1,
    applications: { },
    _links: 
       {
          self: 
             {
                href: "http://localhost:8080/adverts/2"
              }
        }
}
通常,应用程序字段应填充代表每个应用程序的不同对象


还有什么方法可以克服这个问题吗?谢谢!

Apiskelets供应商软件包是经过设计的。我同意你的观点,希望它能返回集合,但解决方法很简单:创建一个新的策略

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

全班:

名称空间应用\策略;
使用doctriemodule\Stdlib\Hydrator\Strategy\AllowRemoveByValue;
使用ZF\Hal\Collection;
类单向AltomAnyStrategy扩展AllowRemoveByValue
{
公共函数摘录($value)
{
返回新集合($value?:[]);
}
}
在您需要的地方应用此策略。例如,您的
广告
应尽可能多地使用
应用程序
,因此应按如下方式修改配置:

'doctrine-hydrator'=>[
'Fil\\V1\\Entity\\ApplicationHydrator'=>[
//其他配置
“策略”=>[
“广告”=>\Application\Strategy\UniDirectionalToManyStrategy::class,
],
],
],
现在应该返回集合



快速提示:这只能作为*ToMany一方的策略

您最终解决了这个问题吗?
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"
         }
    }
}
{
    id: 2,
    name: "Advert1,
    applications: { },
    _links: 
       {
          self: 
             {
                href: "http://localhost:8080/adverts/2"
              }
        }
}