2017-12-30 49 views
1

私はユーザテーブルに重複したくないです。これは、[OK]を次のようになります。Laravel更新が存在しない場合(重複チェック)

public function store(UserRequest $request) { 

    $user = User::firstOrCreate([ 
     'firstname'    => request('firstname'), 
     'lastname'    => request('lastname'), 
     'dateOfBirth'   => request('dateOfBirth'), 
    ]); 

    if($user->wasRecentlyCreated) { 
     // new 
    }else { 
     // existing 
    } 

    return redirect('/users'); 
} 

これはかなり働いていた:私のLaravelアプリケーション(UserController)で

╔═══╦════════════╦═════════════╦═════════════╗ 
║ ║ firstname ║ lastname ║ dateOfBirth ║ 
╠═══╬════════════╬═════════════╬═════════════╣ 
║ 1 ║ John  ║ Mat   ║ 1999-12-01 ║ 
║ 2 ║ Dave  ║ Bittner  ║ 1950-06-02 ║ 
║ 3 ║ John  ║ Mat   ║ 1900-11-02 ║ 
╚═══╩════════════╩═════════════╩═════════════╝ 

ユーザーがすでにfirstOrCreateメソッド(新しいユーザーの作成)を呼び出すことによって存在している場合、私がチェックしていますよく今、私は同様のユーザーを成功させることができます(上の例の表のid=3のエントリのように)。エントリ3の誕生日を1999-12-01に編集すると、Laravelはそれは問題ないと言いますが、(id=1と重複していません)!

また、エントリがすでに存在する場合は、更新をチェックしたい(更新があるたびに重複チェック)。私はupdateIfNotDuplicateメソッドなどを探しています(更新の場合はfirstOrCreateのように)。

これはUserControllerの私update機能です:

public function update(User $user, UserRequest $request) { 
    $user->update([ 
     'firstname'    => request('firstname'), 
     'lastname'    => request('lastname'), 
     'dateOfBirth'   => request('dateOfBirth'), 
    ]); 

    return redirect('/users'); 
} 
+0

を試すことができます)なぜ、あなたは 'UserRequest'オブジェクトを持って – Sark

+0

あなたの問題を解決します'dateOfBirth'カラムに' unique'制約を追加しないでください。 – Ohgodwhy

+0

@Ohgodwhy:誕生日は同じだが名前の異なる2人のユーザーが存在する可能性もあります。私はMCVEを作成しようとしました。私の本当のテーブルははるかに大きいです。 idフィールドの代わりにhole-table-composite-keyとして見ることができます。 – Pengxer

答えて

1

あなたは、私がupdateOrCreateを(使用して考えて、この

public function update(User $user, UserRequest $request) { 

    $update = [ 
     'firstname'    => request('firstname'), 
     'lastname'    => request('lastname'), 
     'dateOfBirth'   => request('dateOfBirth'), 
    ]; 

    // find if your updated user already exists 
    $new_user = $user->firstOrNew($update); 

    // Update if the no changes has been made or if no user have been founded 
    if($new_user->id == $user->id OR !$new_user->exists){ 
     $user->update($update); 

    } 

} 
+0

ありがとうございました! '!$ new_user-> exists()'を '!$ new_user-> exists'(https://stackoverflow.com/a/41082793/2056125)に変更する必要があります。この後、かなりうまく働いています。このソリューションのおかげでたくさん! – Pengxer

+0

確かに、私の悪い、私は私の答えを修正した –

関連する問題