【问题标题】:Eloquent: access model relation or create new [duplicate]Eloquent:访问模型关系或创建新的[重复]
【发布时间】:2017-04-05 12:37:39
【问题描述】:

假设数据库中有2个表:user,appUser(用户有一个appUser并且定义了关系)有用户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);

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

在这种情况下,它会是这样的:

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

【问题讨论】:

    标签: php laravel orm eloquent lumen


    【解决方案1】:

    从 Laravel 5.3.23 开始,withDefault 关系中添加了一个新的 withDefault 方法,应该可以帮助解决这个问题。

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

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

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

    $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();
    

    【讨论】:

    • 不知道 withDefault() 方法,这太棒了!谢谢
    猜你喜欢
    • 2015-03-09
    • 1970-01-01
    • 2019-08-11
    • 2017-05-21
    • 2019-09-20
    • 2015-10-29
    • 2016-02-26
    • 2014-11-22
    • 1970-01-01
    相关资源
    最近更新 更多