Eloquent hasOne vs принадлежит для того, чтобы выродиться до той же функции, если указаны оба ключа?

В случае отношения "один к одному", если я полностью определяю ключи в вызовах метода, существует ли разница между отношениями hasOne и belongsTo? Или, по-другому, если бы я использовал hasOne по обе стороны от отношения, это был бы тот же результат?

Ответы

Ответ 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 могут вести себя одинаково в некоторых ситуациях. Их явно нет. Более сложные взаимодействия с отношениями не сработают, и это бессмыслица с семантической точки зрения.