Php 如何在请求子资源时显示多个关系表中的额外字段

Php 如何在请求子资源时显示多个关系表中的额外字段,php,rest,symfony,doctrine-orm,api-platform.com,Php,Rest,Symfony,Doctrine Orm,Api Platform.com,我需要显示特定“cars”的“drivers”的“skill”,它来自一个关系表“relationship\u Car\u drivers”,这个字段应该只出现在子资源调用“/cars/:id/drivers”和“/drivers/:id/cars”时 我有三张桌子: 汽车(id、型号) 司机(身份证、姓名) 与汽车和司机的关系(身份证、汽车身份证、司机身份证、技能) 我的主要API资源有: 获取/获取车辆 GET/cars/:id 获取/驱动程序 获取/drivers/id 我的API

我需要显示特定“cars”的“drivers”的“skill”,它来自一个关系表“relationship\u Car\u drivers”,这个字段应该只出现在子资源调用“/cars/:id/drivers”和“/drivers/:id/cars”时

我有三张桌子:

  • 汽车(id、型号)
  • 司机(身份证、姓名)
  • 与汽车和司机的关系(身份证、汽车身份证、司机身份证、技能)
我的主要API资源有:

  • 获取/获取车辆
  • GET/cars/:id
  • 获取/驱动程序
  • 获取/drivers/id
我的API子资源是:

  • GET/drivers/:id/cars(列出特定驾驶员使用的车辆)
  • GET/cars/:id/drivers(列出特定汽车的驱动程序)
对于那些子资源调用,我想返回来自它们关系的“技能”值

实体车:

#src/Entity/Car.php
名称空间App\Entity;
/**
*@ORM\Table(name=“Car”)
*@ORM\Entity
*
*@ApiResource(
*次级资源业务={
*“驱动程序\u获取\u子资源”={
*“方法”=“获取”,
*“路径”=“/cars/{id}/drivers”
*          }
*      }
* )
*/
班车
{
// ...
/**
*@ORM\ManyToMany(targetEntity=“App\Entity\Driver”,inversedBy=“cars”)
*@JoinTable(name=“Relation\u Car\u Driver”,
*joinColumns={@JoinColumn(name=“car_id”,referencedColumnName=“id”)},
*inverseJoinColumns={@JoinColumn(name=“driver\u id”,referencedColumnName=“id”)}
* )
*@ApiSubresource(maxDepth=1)
*/
私人司机;
}
实体驱动程序:

#src/Entity/Driver.php
名称空间App\Entity;
/**
*@ORM\Table(name=“Driver”)
*@ORM\Entity
*
*@ApiResource(
*次级资源业务={
*“汽车获取子资源”={
*“方法”=“获取”,
*“路径”=“/drivers/{id}/cars”
*          }
*      }
* )
*/
类驱动程序
{
// ...
/**
*@ORM\ManyToMany(targetEntity=“App\Entity\Car”,inversedBy=“drivers”)
*@JoinTable(name=“Relation\u Car\u Driver”,
*joinColumns={@JoinColumn(name=“driver\u id”,referencedColumnName=“id”)},
*inverseJoinColumns={@JoinColumn(name=“car\u id”,referencedColumnName=“id”)}
* )
*@ApiSubresource(maxDepth=1)
*/
私家车;;
}
实体关系车司机:


我也有类似的问题,刚找到你的帖子。我使用在“Driver”实体上定义的一个组(例如:api_read)解决了这个问题,并将该组添加到“skill”属性中,然后用“car”实体将其打印出来,从而实现了您想要的功能。我遇到了类似的问题,刚刚找到了您的帖子。我使用在“驱动者”实体上定义的一个组(例如:api_read)解决了这个问题,并将该组添加到“技能”属性中,将使用“汽车”实体将其打印出来,从而实现了您所寻找的目标。条令无法处理添加一个实体“作为多对多关系实体”,而是关系实体(RelationCarDriver)必须有两个多对一关系,一个对汽车,一个对驾驶员(多对多变成一对多,关系实体在汽车和驾驶员上),然后你可能需要添加一些逻辑来再次展平它。。。当然,除非api平台有一些我不知道的逻辑,因为我不知道api平台主义不能处理添加实体“作为多对多关系实体”的问题,相反,关系实体(RelationCarDriver)必须有两个多对一关系,一个对汽车,一个对司机(多对多变成了一对多的关系,与汽车和驾驶员的关系实体),然后你可能需要添加一些逻辑来再次将其展平……当然,除非api平台有一些我不知道的逻辑,因为我不知道api平台
{
  "@context": "/api/contexts/Car",
  "@id": "/api/drivers/1/cars",
  "@type": "hydra:Collection",
  "hydra:member": [
    {
      "@id": "/api/cars/1",
      "@type": "Car",
      "id": 1,
      "model": "Mustang"
    },
    {
      "@id": "/api/cars/2",
      "@type": "Car",
      "id": 2,
      "model": "Chevrolet"
    }
  ],
  "hydra:totalItems": 2
}
{
  "@context": "/api/contexts/Car",
  "@id": "/api/drivers/1/cars",
  "@type": "hydra:Collection",
  "hydra:member": [
    {
      "@id": "/api/cars/1",
      "@type": "Car",
      "id": 1,
      "model": "Mustang",
      "skill": 63
    },
    {
      "@id": "/api/cars/2",
      "@type": "Car",
      "id": 2,
      "model": "Chevrolet",
      "skill": 13
    }
  ],
  "hydra:totalItems": 2
}