[英]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.