Eloquent hasOne vs belongs如果指定了两个键,则退化为相同的函数?

时间:2014-10-01 21:24:57

标签: laravel laravel-4 eloquent

对于一对一关系的情况,如果我在方法调用中完全指定了键,那么hasOnebelongsTo关系之间是否存在差异?或者,换句话说,如果我在关系的两边使用hasOne,它会是相同的结果吗?

1 个答案:

答案 0 :(得分:12)

是的,它适用于某些个案,以指定密钥并使关系起作用。在某些情况下,我的意思是主要是检索结果。这是一个例子:

DB

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_idprofiles的外键。

虽然这可能有用,但在使用更复杂的关系方法时会遇到麻烦。

例如associate

$user = User::find(1);
$profile = Profile::find(2);
$profile->user()->associate($user);
$profile->save();

该调用将引发异常,因为HasOne没有方法associate。 (BelongsTo有它)

结论

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