Вступление:
У меня есть эти таблицы с их моделями:
Правила:
Здесь можно выполнить два возможных планирования отношений:
Пользователь hasOne Адрес и адрес принадлежит Пользователь [т.е. взаимно-однозначное отношение], но недостатком является то, что внешний ключ здесь находится в таблице адресов, то есть в поле ID пользователя, и, повторяя такое же отношение с другими моделями [Компания и Собственность], мы получим еще два внешних ключа в таблице адресов, которые равны [Идентификатор компании и property_id], тогда мы получим 3 внешних ключа для 3 моделей. Но запись только один будет заполнен каждой строкой всегда оставляет два поля внешних ключей пустыми.
Я считаю, что это накладные расходы на таблицу адресов.
ИЛИ наоборот:
Мой вопрос:
Есть ли какие-либо другие отношения, которые могут связать эти 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);
}
Вы можете сохранить поле типа как enum
Я согласен с вами, поскольку это похоже на то, что я ищу в MorphOne Relationship. Но я бы использовал для этого Eloquent вместо того, чтобы делать это вручную - это нужно для того, чтобы воспользоваться преимуществами встроенных отношений Eloquent вместо того, чтобы я вручную создавал сеттеры и геттеры.
Меня больше беспокоит построение отношений, чем хранение самих данных, поскольку я могу ограничить значения и типы хранилищ данных с помощью AddressController непосредственно в Laravel. То, что мне нужно, - это правильные отношения Eloquent между Address и другими 3 моделями User, Company и Property, чтобы использовать их в дальнейшем коде проекта.






Вот взаимосвязь в MorphOne между Адрес с одной стороны и Пользователь, Компания и Имущество с другой стороны:
class Address extends Model
public function addressable(){
return $this->morphTo();
}
}
class User extends Model
public function address(){
return $this->morphOne(Address::class,'addressable'); //note this is not MorphMany()
}
}
class Company extends Model
public function address(){
return $this->morphOne(Address::class,'addressable');
}
}
class Property extends Model
public function address(){
return $this->morphOne(Address::class,'addressable');
}
}
затем в UserController что-то вроде этого:
$user = User::find(1);
$addressData = [
'street_name' => '5, Golf street',
'country_id' => 100, //etc..
];
//to add new address record related to user:
$user->address()->create($addressData);
dd($user->address);
//to update existing address record related to user:
$user->address->update($addressData);
//dd($user->address);
Как насчет того, чтобы сохранить поля идентификатора и типа в таблице адресов. Здесь идентификатор будет идентификатором из таблицы пользователя, компании или свойства, а тип будет хранить имя (пользователь / компания / свойство), которому принадлежит этот идентификатор. Как этого добиться, используя красноречие, я не уверен