@chizh42

Symfony, Doctrine, PostgreSQL. Как правильно организовать связи между сущностями?

Доброго времени суток!
Начал знакомиться с Symfony. В процессе возникли некоторые вопросы, связанные с сущностями.
В базе есть таблицы:

Users (id, login, password, ...);
Salers (id, user_id, ..., FOREIGN KEY(user_id) REFERENCES Users(id));
Managers (id, user_id, ..., FOREIGN KEY(user_id) REFERENCES Users(id));
Customers (id, user_id, ..., FOREIGN KEY(user_id) REFERENCES Users(id));

Т.е. таблица "Users" содержит общие поля для всех пользователей. В зависимости от типа создается запись в связной таблице, где хранятся индивидуальные для каждого типа пользователей атрибуты.
В доке по ORM и в нагугленных статьях связи как-то однобоко рассмотрены (из тех, что я нашел, конечно же).
Везде рассматриваются связи между разными сущностями. И при использовании такого подхода классы сущностей будут выглядеть так (аннотации связей на память не помню, простите(( ):

class User
{
	protected $id;
	protected $login;
	protected $password;
	// и т.д....
}

class Saler
{
	protected $id;
	
	/**
	 * @OneToOne(targetEntity="User", ...)
	 */
	protected $user;
	// и т.д....
}


Managers и Customers по аналогии.

С User всё предельно понятно. С остальными - не очень как-то.
Как указывать связи в таком случае? И OneToOne ли это?
При такой связи доступ к общим полям будет осуществляться через конструкцию типа

$saler->user->getLogin();

Верно ли я понял? Если да, то...
Можно ли организовать доступ к полям сущностей так, как это было бы при наследовании, при этом храня общие поля в таблице Users (как это сейчас в базе и есть)?

class Saler extends User{...}
// $saler instanceof Saler;
$saler->getLogin(); // User-method


Пробовал классы сущностей вручную дополнить "... extends User", в базе получалось так, что все таблицы создавались полностью с родительскими полями. Это не совсем то, что хотелось бы.
  • Вопрос задан
  • 464 просмотра
Решения вопроса 1
Maksclub
@Maksclub
maksfedorov.ru
Можно ли организовать доступ к полям сущностей так, как это было бы при наследовании, при этом храня общие поля в таблице Users (как это сейчас в базе и есть)?
class Saler extends User{...}

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


Вот то — поля родительской сущности в отдельной таблице, в своей только индивидуальные
Class Table Inheritance

UPD: Немного перепутал с типом наследования, не single table, а class table конечно. Возможно вы разобрались, но другим пометки
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы