Symfony / Doctrine Shared Entity - PullRequest
       6

Symfony / Doctrine Shared Entity

0 голосов
/ 10 декабря 2018

Я хотел бы создать объект 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 и Доктрина?Я действительно не хочу иметь ProductNote , SupplierNote , OrderNote и т. Д., И т. Д., И т. Д., И т. Д., И т. Д., И т. Д., И т. Д., И т. Д., И т. Д.

1 Ответ

0 голосов
/ 11 декабря 2018

То, что вы ищете, это Наследственное учение .При этом вы создадите модель Note как абстрактную, а затем создадите ProductNote, SupplierNote и т. Д. Точно так же, как простые сущности (будут только по классу и @Entity аннотации).

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

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

...