В случае отношения "один к одному", если я полностью определяю ключи в вызовах метода, существует ли разница между отношениями hasOne и belongsTo? Или, по-другому, если бы я использовал hasOne по обе стороны от отношения, это был бы тот же результат?
Eloquent hasOne vs принадлежит для того, чтобы выродиться до той же функции, если указаны оба ключа?
Ответ 1
Да, в некоторых случаях это работает, чтобы указать ключи и заставить работу работать. И в некоторых случаях я имею в виду главным образом получение результатов. Вот пример:
БД
users profiles
----- --------
id id
etc... user_id
etc...
Модели
Использование "неправильных" отношений с hasOne дважды
class User extends Eloquent {
public function profile(){
return $this->hasOne('Profile');
}
}
class Profile extends Eloquent {
public function user(){
return $this->hasOne('User', 'id', 'user_id');
}
}
Запросы
Скажем, мы хотели получить пользователя от определенного профиля
$profile = Profile::find(1);
$user = $profile->user;
Это работает. Но он не работает, как это должно быть. Он будет обрабатывать первичный ключ users как внешний ключ, который ссылается на user_id в profiles.
И хотя это может сработать, вы столкнетесь с проблемами при использовании более сложных методов отношений.
Например associate:
$user = User::find(1);
$profile = Profile::find(2);
$profile->user()->associate($user);
$profile->save();
Вызов вызовет исключение, потому что hasOne не имеет метода associate. (BelongsTo имеет)
Заключение
В то время как BelongsTo и hasOne могут вести себя одинаково в некоторых ситуациях. Их явно нет. Более сложные взаимодействия с отношениями не сработают, и это бессмыслица с семантической точки зрения.