Be part of JetBrains PHPverse 2026 on June 9 – a free online event bringing PHP devs worldwide together.

Symefa's avatar

Laravel firstOrNew create duplicate entry for same data

I have this specific code from my application:

 if ($request->filled('jawaban')) {
                $jawaban = JawabanUserM::where('user_id', $user->id)
                    ->where('paket_id', $kuis['paket_id'])->firstOrNew(['soal_id'=>$kuis['curr_id']]);
                if($jawaban->jawaban_id != $request->jawaban) {
                    $jawaban->user_id = $user->id;
                    $jawaban->paket_id = $kuis['paket_id'];
                    $jawaban->soal_id = $kuis['curr_id'];
                    $jawaban->jawaban_id = $request->jawaban;
                    $jawaban->save();
                }

        }

it basicly insert answer from user to table JawabanUserM

I run this application on deployment. using mysql 5.5.58, nginx 1.12.2, php-fpm 7.0.27. with 800-1000++ average user at a time.

when i check around i found some duplicate records. i check using this sql :

SELECT
    id, soal_id, user_id, jawaban_id, paket_id, COUNT(*)
FROM
    jawabanuserm
GROUP BY
    soal_id, user_id, jawaban_id, paket_id
HAVING 
    COUNT(*) > 1
ORDER BY COUNT(*) DESC

the result was :

|   id  |   soal_id |   user_id |   jawaban_id  |   paket_id    |   COUNT(*)    |
|   --  |   ------- |   ------- |   ----------  |   --------    |   --------    |
| 4702  | 117       | 100       | 401       | 6         | 6         |
| 4694  | 111           | 100       | 401       | 6         | 5         |
| 15080     | 110       | 1300      | 1077      | 7         | 5         |
| 8097  | 186       | 435       | 686       | 6         | 4         |
| 5891  | 267       | 2315      | 959       | 8         | 4         |
| 4670  | 81            | 100       | 401       | 6         | 4         |
| 6725  | 25            | 1431      | 690       | 9         | 3         |
| 8812  | 43            | 1636      | 261       | 5     | 3         |
| 6036  | 36            | 928       | 10            | 6         | 3         |
| 28663     | 148       | 1006      | 510       | 9     | 3         |
| 5445  | 423       | 2105      | 332       | 8         | 3         |
| 13254     | 286       | 2161      | 751       | 5         | 2         |
| 7659  | 42            | 527       | 280       | 7         | 2         |
| 26838     | 155       | 952       | 743       | 7         | 2         |
| 20401     | 241       | 196       | 984       | 6         | 2         |
| 24444     | 246       | 1976      | 460       | 7         | 2         |
| 5887  | 33            | 2436      | 36            | 5         | 2         |
| 7413  | 4             | 71            | 808       | 5     | 2         |

Any advice to workaround this problem?

0 likes
1 reply
bobbybouwmann's avatar

I think it's because of your where statements in the query. Instead you need to use these where statements in your firstOrNew method

JawabanUserM::firstOrNew([
    'user_id' => $user->id,
    'paket_id' => $kuis['paket_id'],
    'soal_id'=>$kuis['curr_id'],
]);

Please or to participate in this conversation.