Как отобразить черту без отображения какой-либо доктрины?

Мне интересно, нет ли возможности отобразить существующую черту без какой-либо доктрины, отображающей сущность?

trait TimestampableTrait
{
    protected $createdAt;
    protected $updatedAt;
}

/**
 * @ORM\Entity()
 * @ORM\Table(name = "product")
 */
class Product
{
    use TimestampableTrait;

    /**
     *
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type = "integer")
     */
    private $id;
}

Я пробовал Атрибутоверрайд, но, похоже, он работает только с сопоставленными суперклассами.

Есть ли простой способ добиться этого с помощью аннотаций или мне нужно сопоставление yml/xml?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
0
182
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вашей сущности нужен хотя бы один столбец, который действует как первичный ключ. Таким образом, либо вы добавляете столбец ID в сущность Product, либо добавляете некоторые аннотации в TimestampableTrait. Например, это работает:

trait TimestampableTrait
{
    /**
     * @ORM\Id
     * @ORM\Column
     */
    protected $createdAt;
}

/**
 * @ORM\Entity()
 * @ORM\Table(name = "product")
 */
final class Product
{
    use TimestampableTrait;
}

Это производит

CREATE TABLE product (
    created_at VARCHAR(255) NOT NULL, 
    PRIMARY KEY(created_at)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci ENGINE = InnoDB;

Если вы хотите изменить определение столбца в своем классе продуктов, вы можете использовать AttributeOverride следующим образом:

/**
 * @ORM\Entity
 * @ORM\Table(name = "product")
 * @ORM\AttributeOverrides({
 *      @ORM\AttributeOverride(
 *          name = "createdAt", column=@ORM\Column(name = "id")
 *     )
 * })
 */
final class Product
{
    use TimestampableTrait;
}

Что будет производить:

CREATE TABLE product (
    id VARCHAR(255) NOT NULL, 
    PRIMARY KEY(id)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci ENGINE = InnoDB;

Обратите внимание, что вы не можете изменить тип столбца таким образом.

Я обновил свой вопрос, конечно, есть свойство id. К сожалению, я не могу изменить черту.

CSchulz 01.06.2019 21:04

Итак, у вас нет сопоставления для TimestampableTrait и вы хотите создать сопоставления для его полей в Product? Аннотация AttributeOverride для этого не подойдет, так как она переопределяет данные сопоставления, а TimestampableTrait в этом сценарии их не имеет. Что вы можете сделать, это либо а) использовать сопоставления XML, либо б) переопределить свойство в продукте и дать ему аннотацию. Если вам нужен пример, дайте мне знать, но я не уверен, чего именно вы пытаетесь достичь.

Arno Hilke 01.06.2019 23:17

Правильно, карты нет. Я не могу редактировать трейт TimestampableTrait. Я искал простой способ сделать это с помощью аннотаций без дублирования кода, но, похоже, такой возможности нет.

CSchulz 02.06.2019 20:59
Ответ принят как подходящий

Вы просто добавляете аннотацию в класс, где вы хотите, чтобы она была сопоставленным свойством Doctrine. Вот так:

trait TimestampableTrait
{
    protected $createdAt;
    protected $updatedAt;
}
/**
 * @ORM\Entity
 * @ORM\Table(name = "product")
 */
class Product
{
    use TimestampableTrait;

    /**
     * @var DateTime
     * @ORM\Column(type = "datetime", nullable=false)
     */
    protected $createdAt;
}

Это все равно будет работать с геттерами/сеттерами из вашего класса Trait (если они есть), поскольку Trait является частью класса.

Я надеялся, что есть лучший способ.

CSchulz 04.07.2019 09:05

Другие вопросы по теме