对于一对一关系,如果我在方法调用中完全指定了键,则hasOnebelongsTo关系之间有区别吗?或者,以不同的方式询问,如果我在关系的两边都使用了hasOne,结果是否会相同?

最佳答案

是的,在某些情况下,可以指定键并使其起作用。在某些情况下,我的意思主要是检索结果。这是一个例子:

D B

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拥有它)

结论

belongsTohasOne在某些情况下的行为可能相似。他们显然不是。与关系的更复杂的交互将不起作用,并且从语义的角度来看这是毫无意义的。

07-24 17:01