学说中的多态关系2

Die*_*tro 6 symfony doctrine-orm

有没有办法实现Laravel对学说的多态关系?

这是一个例子:

class Address
{
    protected $street;
    ...

    public function setStreet()
    {

    }

    public function getStreet()
    {

    }
}

class Event
{
    /*one to many*/
    protected $addresses;
    ...
}

class Museum
{
    /*one to many*/
    protected $addresses;
    ...
}
Run Code Online (Sandbox Code Playgroud)

在数据库上它将是这样的:

Address:
    id | type (event or museum) | type_id | street ...

Event:
    id | name ...

Museum:
    id | name ...
Run Code Online (Sandbox Code Playgroud)

我看了单表继承,它似乎解决了我的问题,但我不明白如何将事件或博物馆与地址联系起来.如果有人能够ELI5,我将非常感激.

Pet*_*ter 7

它看起来像继承映射的用例,除非您有大量不同的实体要存储地址.使用Doctrine中的示例,您将为每个地址创建两个类.

<?php
namespace MyProject\Model;

/**
 * @Entity
 * @InheritanceType("SINGLE_TABLE")
 * @DiscriminatorColumn(name="type", type="string")
 * @DiscriminatorMap({"event" = "EventAddress", "museum" = "MuseumAddress"})
 */
class Address {
    protected $street;
    // ...
}

/**
 * @Entity
 */
class EventAddress extends Address {
    protected $event;
    // ...
}

/**
 * @Entity
 */
class MuseumAddress extends Address {
    protected $museum;
    // ...
}
Run Code Online (Sandbox Code Playgroud)

阅读有关继承映射的更多信息.

  • 我已经很长时间没有编写任何 PHP 了,但总的来说,现在这个解决方案对我来说似乎是错误的方法,特别是在像多对多多态继承这样复杂的情况下。继承映射带有将数据库架构与对象图硬耦合的味道,这是对 RDBMS 的滥用。[这个答案](https://softwareengineering.stackexchange.com/a/349677)比我更好地解释了这个问题,多年来我一直没有使用像Doctrine这样的ORM。[这篇博文](https://romaricdrigon.github.io/2019/06/11/doctrine-inheritance)也有一些有用的想法。 (2认同)