Введение:
У меня есть эти таблицы с их моделями:
- таблица адресов -> Модель адреса
- таблица пользователей --> Модель пользователя
- таблица компаний -> Модель компании
- таблица свойств -> Модель свойства
Правила:
- каждый пользователь может иметь только один адрес.
- каждая компания может иметь только один адрес.
- каждое свойство может иметь только один адрес.
Здесь можно выполнить два возможных планирования отношений:
Пользователь hasOne Адрес иАдрес принадлежит к Пользователь [то есть отношение один к одному], но недостатком является то, что внешний ключ находится в таблице адресов, то есть поле user_id и повторяетсято же самое отношение с другими моделями [Company and Property], мы получим еще два внешних ключа в таблице адресов, которые являются [ company_id and property_id ], тогда мы получим 3 внешних ключа для 3 моделей, но будет заполнен только один из каждой строки запись, оставляя всегда два поля внешних ключейоставлено пустым
Я чувствую, что это накладные расходы на таблицу адресов.
ИЛИ наоборот:
- Адрес hasOne Пользователь и пользователь принадлежит к Адрес [отношение один к одному также].Это имеет то преимущество, что здесь хранится внешний ключ в связанной модели, т.е. [пользователь, компания и свойство], поэтому нет пустых полей внешних ключей - но все же это противоречит реальной логике моделирования, которая диктует, что Пользователь hasOne Адрес более чем Адрес hasOne Пользователь.
Мой вопрос:
Существуют ли какие-либо другие отношения, которые могут связать эти 4 Модели в одно отношение, подобное Полиморфным Отношениям, но без использования MorphMany , но вместо этого используя MorphOne что довольно странно, я не могу найти его в документации по Laravel, хотя сам метод существует в Eloquent Relations.
Возможно ли это MorphOne полиморфное отношение и как оносоставлен?
Существующий код:
//Address model
public function user(){
return $this->hasOne(User::class);
}
public function company(){
return $this->hasOne(Company::class);
}
public function property(){
return $this->hasOne(Property::class);
}
//User model
public function address(){
return $this->belongsTo(Address::class);
}
//Company model
public function address(){
return $this->belongsTo(Address::class);
}
//Property model
public function address(){
return $this->belongsTo(Address::class);
}