Пользовательская базовая сущность в Symfony 4

Я использую Symfony 4 и Doctrine, где у меня есть объекты, которые имеют одинаковые общие атрибуты, такие как createdWhen, editedWhen, ...

Я бы хотел сделать следующее:

Определение типа базовой сущности, которая содержит эти общие атрибуты и реализует сеттер и геттер. И многие сущности, которые наследуются от этой базовой сущности. Все поля базы данных должны быть определены в таблице соответствующей суб-сущности (в db не должно создаваться супертаблицы и т.п.).

Пример:

/**
 * @ORM\Entity(repositoryClass="App\Repository\BaseRepository")
 */
class Base
{
    /**
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     */
    private $id;

    /**
     * @ORM\Column(type="string", length=127, nullable=true)
     */
    private $createdWhen;

    // Getter and setter
    ...
}


/**
 * @ORM\Entity(repositoryClass="App\Repository\PersonRepository")
 */
class Person extends Base
{
    /**
     * @ORM\Column(type="string", length=127, nullable=true)
     */
    private $name;

    // Getter and setter
    ...
}

/**
 * @ORM\Entity(repositoryClass="App\Repository\CarRepository")
 */
class Car extends Base
{
    /**
     * @ORM\Column(type="string", length=127, nullable=true)
     */
    private $brand;

    // Setter and getter
    ...
}

Это должно создать таблицы «человек» и «автомобиль» (каждая с идентификатором created_when), но без таблицы base.

Я все еще хотел бы иметь возможность использовать bin / console make: migration для обновления схемы базы данных.

Возможен ли такой подход с Symfony 4? Если да, то как мне определить объекты и что мне нужно изменить с точки зрения конфигурации и т. Д.?


person Martin Newman    schedule 06.03.2019    source источник
comment
Со временем вы сможете использовать черты характера. Вот краткое руководство.   -  person cezar    schedule 07.03.2019
comment
@cezar Очень интересный подход! Это решает небольшой недостаток консольного инструмента ... И это может помочь с другим вопросом: упорядочить поля так, как мне нравится, независимо от того, находятся ли они в родительском или базовом классе. Спасибо!   -  person Martin Newman    schedule 08.03.2019


Ответы (1)


Вы ищете наследование сущностей

Перепишите свой код так

/** @MappedSuperclass */
class Base
{
...
}

Фактически, это часть Doctrine, вот что говорится в официальной документации

Сопоставленный суперкласс - это абстрактный или конкретный класс, который обеспечивает постоянное состояние сущности и информацию о сопоставлении для своих подклассов, но сам по себе не является сущностью. Обычно целью такого отображаемого суперкласса является определение информации о состоянии и отображении, которая является общей для нескольких классов сущностей.

person Lunin Roman    schedule 06.03.2019
comment
Ага! Это то, что я ищу! Я попробую, если он работает с консольными инструментами .. - person Martin Newman; 06.03.2019
comment
Мне нужно немного изменить созданный объект после создания объекта с именем Test, запустив php bin / console make: entity, поскольку, похоже, нет вариантов использования суперкласса. Он автоматически создает атрибут id. Но в целом работает ... Спасибо! - person Martin Newman; 06.03.2019