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






Вы ищете Доктрина наследования. С его помощью вы создадите модель заметки как абстрактную, а затем создадите ProductNote, SupplierNote и т. д., Как простые объекты (с помощью только класса и аннотации @Entity).
Для вашего случая (потому что у вас одна и та же структура для всего) я бы выбрал наследование одной таблицы, которое использует одну таблицу и не повлияет на производительность.
Затем в ваших дочерних классах (например, ProductNote) у вас будет только setOwner, который будет принимать конкретный объект, и вы можете сопоставить одно поле для всех дочерних сущностей.
Да, вот как ты это делаешь. Примечание не обязательно должно быть суперклассом, может быть просто определено как абстрактное. И именно после этого вы будете создавать экземпляры ProductNote, ContributorNote и т. д.
Спасибо. Так что, если я правильно понимаю документацию, у меня будет суперкласс
Noteсо свойствами id, noteText, ownerId и ownerType. Мой@DiscriminatorColumnбудет владельцемType. Дочерние классы будут расширятьNote, но сами не будут иметь никаких свойств. Их ownerType будет автоматически установлен при вызовеnew ProductNote;. Это правильно?