【问题标题】:Symfony API Platform entity inheritanceSymfony API 平台实体继承
【发布时间】:2019-08-09 21:43:58
【问题描述】:

我的项目使用实体和 API 平台上的学说 2 类表继承来提供 API 端点。

/**
 * @ORM\Entity(repositoryClass="App\Repository\PartyRepository")
 * @ORM\InheritanceType("JOINED")
 * @ORM\DiscriminatorColumn(name="discr", type="string")
 * @ORM\DiscriminatorMap({
 *      "org" = "Organization",
 *      "person" = "Person"
 * })
 * @ORM\HasLifecycleCallbacks()
 */
abstract class Party {}

/**
 * @ApiResource()
 * @ORM\Entity(repositoryClass="App\Repository\PersonRepository")
 * @ORM\InheritanceType("JOINED")
 * @ORM\DiscriminatorColumn(name="discr", type="string")
 * @ORM\DiscriminatorMap({
 *      "person" = "Person",
 *      "agent" = "Agent"
 * })
 * @ORM\HasLifecycleCallbacks()
 */
class Person extends Party {}

/**
 * @ApiResource()
 * @ORM\Entity(repositoryClass="App\Repository\AgentRepository")
 * @ORM\HasLifecycleCallbacks()
 */
class Agent extends Person {
    private $affiliation;
}

问题是在查看Person 的 API 平台模型时,它具有所有子属性,例如 Agent::$affiliation

Agent {
  affiliation string
  name string
    readOnly: true

  familyName string
  givenName string
  id string
    readOnly: true

  createdAt string($date-time)
  updatedAt string($date-time)
}

Person {
  name string
    readOnly: true

  familyName string
  givenName string
  id string
    readOnly: true

  createdAt string($date-time)
  updatedAt string($date-time)
  affiliation string
}

【问题讨论】:

    标签: php symfony doctrine api-platform.com


    【解决方案1】:

    直接来自“注意事项”下的docs for doctrine Class Table Inheritance

    @InheritanceType、@DiscriminatorColumn 和 @DiscriminatorMap 必须在作为映射实体层次结构一部分的 topmost 类中指定

    尝试以下操作并更新架构

    /**
     * @ORM\Entity(repositoryClass="App\Repository\PartyRepository")
     * @ORM\InheritanceType("JOINED")
     * @ORM\DiscriminatorColumn(name="discr", type="string")
     * @ORM\DiscriminatorMap({
     *      "org" = "Organization",
     *      "person" = "Person",
     *      "agent" = "Agent"
     * })
     * @ORM\HasLifecycleCallbacks()
     */
    abstract class Party {}
    
    /**
     * @ApiResource()
     * @ORM\Entity(repositoryClass="App\Repository\PersonRepository")
     * @ORM\HasLifecycleCallbacks()
     */
    class Person extends Party {}
    
    /**
     * @ApiResource()
     * @ORM\Entity(repositoryClass="App\Repository\AgentRepository")
     * @ORM\HasLifecycleCallbacks()
     */
    class Agent extends Person {
        private $affiliation;
    }
    

    【讨论】:

    • 试过了,已经一样了。顺便说一句,这两种方式都适用于其他一切,所以我最终将 Person/Org 分开,因为这对我来说更有意义......但现在我认为恢复到“doc”方式可能更安全。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-05
    • 2021-08-03
    • 2016-03-31
    • 1970-01-01
    • 1970-01-01
    • 2021-05-29
    • 1970-01-01
    相关资源
    最近更新 更多