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();
假设数据库中有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();