Eloquent: 访问模型关系或新建

Eloquent: access model relation or create new

假设数据库中有2个table: user, appUser (user有一个appUser并且定义了关系) 有了user id,为了更新appUser数据我们可以使用下面的代码(如果有没有 appUser 相关模型):

$user = user::find($userID);
if(count($user->appUser) == 0){
    $appUser = new appUser();
    $appUser->column = $value;
    $user->appUser->save();
} else {
    $appUser = $user->appUser;
    $appUser->column = $value;
}
$user->appUser()->save($appUser);

看起来不错,但是如果我有另一个联系人 table(appUser 有一个联系人)怎么办,所以为了更新联系人,我们应该添加更多的 ifs 和 elses 以确保 appUser 和联系人关系存在。 我的问题是,有没有任何简洁的方法可以在 laravel eloquent 中 加载一个关系并在不存在的情况下创建新关系

在那种情况下它会像:

$user = user::find($userID);
// No Exception!
$user->appUser->column = $value;
$user->appUser->save();

从 Laravel 5.3.23 开始,有一个新的 withDefault 方法被添加到 HasOne 关系中,应该有助于解决这个问题。

在您的示例中,您的 user 模型将具有以下关系:

public function appUser() {
    return $this->hasOne(appUser::class)->withDefault();
}

这将做的是,如果数据库中没有相关记录,它将return一个相关(appUser)class的新实例。所以,你的代码最终会看起来像:

$user = user::find($userID);
// if user has an appuser, $user->appUser will return it;
// otherwise, it will return a new instance of your appUser model
$user->appUser->column = $value;
$user->appUser()->save();