【问题标题】:Unable to update tables in one-to-many relationship in laravel 5.8无法在 laravel 5.8 中更新一对多关系中的表
【发布时间】:2019-12-11 04:57:22
【问题描述】:

我是 laravel 的新手,正在制作身份验证系统,用户可以使用 facebook、twitter 或简单的电子邮件登录

我做了两张桌子

1 个用户

2-user_social_accounts

它们之间是一对多的关系(一个用户可以有多个社交帐户)。

型号详情

用户模型

public function user_social_accounts()
    {
        return $this->hasMany('App\UserSocialAccount');
    }

UserSocialAccount 模型

public function user()
    {
        return $this->belongsTo('App\User');
    }

现在是逻辑

案例1-

-如果用户首次使用电子邮件注册,则将创建一条新记录 - 如果用户使用 facebook 登录,那么他的电子邮件将存储到 user 表中,而 facebook 数据将存储在 user_social_accounts 表中 - 如果用户再次使用同一电子邮件与 twitter 登录,则将在 user_social_accounts 中创建一条新记录

案例2-

-如果用户首次使用社交网站登录并且该电子邮件不存在他的记录,则首先他的电子邮件将存储在user表中,然后facebook数据将存储在user_social_accounts表中

-如果用户再次使用相同的电子邮件注册(简单登录),那么我将更新数据库中的电子邮件记录(如果存在)。

所以就像如果不存在则创建,如果存在则更新(基于电子邮件)。

我非常接近,但从过去 1 天开始就卡住了

这是我的身份验证控制器

public function facebook_login(Request $request) {    
    $validator = Validator::make($request->all(), [ 
      'first_name' => 'required',
      'last_name' => 'required',
      'photo' => 'required',
      'email' => 'required|email',
      'facebook_id' => 'required',
      'fcm_token' => 'required'
    ]);   

    if($validator->fails()){
      $status  = 0;
      $data['message'] = $validator->errors();
      return response()->json(['status' => $status,'data' => $data], 401);
    }   

    $input = $request->all();
    $user = User::updateOrCreate(['email' => $input['email']],$input);

    $user = User::find($user['id']);
    $account_details = new UserSocialAccount();
    $account_details->first_name = $input['first_name'];
    $account_details->last_name = $input['last_name'];
    $account_details->photo = $input['photo'];
    $account_details->provider_id = $input['facebook_id'];
    $account_details->provider_name = 'facebook';
    $account_details->fcm_token = $input['fcm_token'];
    $input['provider_name'] = 'facebook';
    //the following line is saving new records and not updating them
    $user->user_social_accounts()->save($account_details);

}

下面一行是保存新记录而不是更新它们

$user->user_social_accounts()->save($account_details);

请指导我,我很担心。感谢并提前对任何愚蠢的问题表示抱歉。

【问题讨论】:

    标签: php laravel eloquent laravel-5.8


    【解决方案1】:

    您当前正在创建一条新记录,然后将其保存,因此这是预期的行为。您将需要以不同的方式处理此问题。在我看来,这种关系只是在这种情况下妨碍了。

    相反,我会这样做并手动引用关系:

    // ... previous code 
    
    $input = $request->all();
    
    $user = User::updateOrCreate([
        'email' => $input['email']
    ],$input);
    
    $account_details = UserSocialAccount::updateOrCreate([
        'user_id' => $user->id, // refer to the relationship manually
        'provider_name' => 'facebook'
    ],[
        'first_name' => $input['first_name'],
        'last_name' => $input['last_name'],
        'photo' => $input['photo'],
        'provider_id' => $input['facebook_id'],
        'fcm_token' => $input['fcm_token'],
    ])
    
    // then if you need the new relationship loaded in your response
    $user->load('user_social_accounts');
    
    // do more stuff...
    

    编辑: 作为一个后置脚本,我要补充一点,任何时候您执行多个相关的数据库插入,就像这样,您应该真正考虑使用事务。您可以在下面的链接中找到更多信息。

    https://laravel.com/docs/5.8/database#database-transactions

    我希望这会有所帮助,祝你好运!

    【讨论】:

      猜你喜欢
      • 2019-11-17
      • 1970-01-01
      • 2021-07-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-05
      • 2019-11-30
      • 1970-01-01
      相关资源
      最近更新 更多