簡體   English   中英

無法在 Laravel 5.8 中以一對多關系更新表

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM