[英]Unable to update tables in one-to-many relationship in laravel 5.8
我是 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 天开始卡住了
这是我的 Auth 控制器
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);
请指导我,我很担心。感谢并提前为任何愚蠢的问题道歉。
您当前正在创建一个新记录然后保存它,所以这是预期的行为。 您将需要以不同的方式处理此问题。 在我看来,这种关系只是在这种情况下妨碍了。
相反,我会这样做并手动引用关系:
// ... 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
我希望这个帮助能祝你好运!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.