Общая сущность Symfony / Doctrine

Я хотел бы создать объект Note в моем проекте Symfony, который можно было бы использовать с несколькими другими объектами. Например, его можно использовать, чтобы оставить комментарий о продукт, комментарий о поставщик или комментарий о приказ. Они будут очень похожи на примечания, внесенные пользователями в руководстве по PHP.

Все мои объекты имеют целочисленный идентификатор, поэтому я подумал, что лучший способ реализовать это - иметь в заметке поля ownerId и ownerType. ownerId будет установлен на идентификатор продукта, идентификатор поставщика или идентификатор заказа. ownerType будет установлен на имя объекта.

В любой сущности, к которой я хотел бы прикрепить примечания (например, продукт, поставщик, приказ и т. д.), Я бы добавил:

/**
 * @ORM\OneToMany( targetEntity = "Note", mappedBy = "ownerId" )
 */
private $notes;

public function addNote( $n ) {
    if ( !$this->notes->contains( $n ) ) {
        $this->notes[] = $n;
        $n->setProduct( $this );
    }
}

В заметке у меня было бы:

public function setOwner( $o ) {
    $this->ownerId = $o->getId();
    $this->ownerType = get_class( $o );
}
public function setProduct( $p ) {
    $this->setOwner( $p );
}
public function setSupplier( $s ) {
    $this->setOwner( $s );
}
public function setOrder( $o ) {
    $this->setOwner( $o );
}

Это создает проблемы, потому что нет поля сторона собственника или владение боковым полем не является ассоциацией, или, если я создам его, его целевая сущность неверна и т. д.

Есть ли способ реализовать эту структуру с помощью Symfony и Doctrine? Я действительно не хочу иметь таблицы ProductNote, SupplierNote, OrderNote и т. д., Т. Д. И т. Д. И весь дублированный код.

Стоит ли изучать 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 и хотите разрабатывать...
1
0
402
1

Ответы 1

Вы ищете Доктрина наследования. С его помощью вы создадите модель заметки как абстрактную, а затем создадите ProductNote, SupplierNote и т. д., Как простые объекты (с помощью только класса и аннотации @Entity).

Для вашего случая (потому что у вас одна и та же структура для всего) я бы выбрал наследование одной таблицы, которое использует одну таблицу и не повлияет на производительность.

Затем в ваших дочерних классах (например, ProductNote) у вас будет только setOwner, который будет принимать конкретный объект, и вы можете сопоставить одно поле для всех дочерних сущностей.

Спасибо. Так что, если я правильно понимаю документацию, у меня будет суперкласс Note со свойствами id, noteText, ownerId и ownerType. Мой @DiscriminatorColumn будет владельцемType. Дочерние классы будут расширять Note, но сами не будут иметь никаких свойств. Их ownerType будет автоматически установлен при вызове new ProductNote;. Это правильно?

LavaSlider 11.12.2018 22:58

Да, вот как ты это делаешь. Примечание не обязательно должно быть суперклассом, может быть просто определено как абстрактное. И именно после этого вы будете создавать экземпляры ProductNote, ContributorNote и т. д.

M. Kebza 12.12.2018 02:19

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