Как проверить, существует ли запись и не дублирует ли метод firstOrCreate laravel

#laravel #eloquent

#laravel #красноречивый

Вопрос:

Как использовать метод firstOrCreate laravel, например, вот так

я попробовал, как показано ниже, это нормально, что я это делаю?

 $insert[] = [
   'bulan' => $bulan,
   'tahun' => $tahun,
   'nama_pkp'  => $v["nama_pkp"],
   'keterangan'=> $v["keterangan"],
   'no_faktur_pajak'   => $v["no_faktur_pajak"],
   'tgl_faktur_pajak'  => $tgl_faktur_pajak_format,
   'ref'   => $v["ref"],
   'dpp'   => $v["dpp"],
   'ppn'   => $ppn,
   'invoice_no'=> $v["invoice_no"],
   'nama_tenant'   => $v["nama_tenant"],
   'pph_4_deyon'   => $v["pph_4_deyon"],
   'pph_4_tenant'  => $v["ppn"],
   'no_p_l_tenant' => $v["no_potong_dan_lapor_tenant"],
   'bukpot_oleh_tenant'=> $v["bukti_potong_oleh_tenant"],
   'tgl_p_l_penyewa'   => $tgl_p_l_penyewa_format,
   'pph_p_l_tenant'=> $v["pph_potong_dan_lapor_tenant"],
   'note'  => $v["note"],
   'checklist' => $v["checklist"],
   'selisih'   => $selisih,
];

$insertData[] = Data::firstOrCreate($insert);
  

и у меня ошибка, подобная этой

Синтаксическая ошибка или нарушение доступа: 1064 У вас ошибка в синтаксисе SQL; проверьте руководство, соответствующее вашей версии сервера MariaDB

я добавил код AppServiceProvider

 Schema::defaultStringLength(191);
  

что не так с моим кодом?

Ответ №1:

Я предполагаю, что вы проверяете все столбцы в базе данных, это должно выглядеть более чисто и опрятно

 $data = Data::firstOrCreate([
       'bulan' => $bulan,
       'tahun' => $tahun,
       'nama_pkp'  => $v["nama_pkp"],
       'keterangan'=> $v["keterangan"],
       'no_faktur_pajak'   => $v["no_faktur_pajak"],
       'tgl_faktur_pajak'  => $tgl_faktur_pajak_format,
       'ref'   => $v["ref"],
       'dpp'   => $v["dpp"],
       'ppn'   => $ppn,
       'invoice_no'=> $v["invoice_no"],
       'nama_tenant'   => $v["nama_tenant"],
       'pph_4_deyon'   => $v["pph_4_deyon"],
       'pph_4_tenant'  => $v["ppn"],
       'no_p_l_tenant' => $v["no_potong_dan_lapor_tenant"],
       'bukpot_oleh_tenant'=> $v["bukti_potong_oleh_tenant"],
       'tgl_p_l_penyewa'   => $tgl_p_l_penyewa_format,
       'pph_p_l_tenant'=> $v["pph_potong_dan_lapor_tenant"],
       'note'  => $v["note"],
       'checklist' => $v["checklist"],
       'selisih'   => $selisih
]);
  

Комментарии:

1. я проверил свой столбец, в нем нет ошибок

Ответ №2:

Вы передали многомерный массив в firstOrCreate ,

firstOrCreate() проверяет наличие всех аргументов, прежде чем найдет совпадение. Если не все аргументы совпадают, то будет создан новый экземпляр модели.

Если вы хотите проверить только определенное поле, тогда используйте firstOrCreate([‘field_name’ => ‘value’]) только с одним элементом в массиве. Это вернет первый элемент, который соответствует, или создаст новый, если совпадения не найдены.

Если вы используете его внутри цикла, то это должно быть так

 foreach ($variable as $v) {
    $insert = [
        'bulan' => $bulan,
        'tahun' => $tahun,
        'nama_pkp'  => $v["nama_pkp"],
        'keterangan'=> $v["keterangan"],
        'no_faktur_pajak'   => $v["no_faktur_pajak"],
        'tgl_faktur_pajak'  => $tgl_faktur_pajak_format,
        'ref'   => $v["ref"],
        'dpp'   => $v["dpp"],
        'ppn'   => $ppn,
        'invoice_no'=> $v["invoice_no"],
        'nama_tenant'   => $v["nama_tenant"],
        'pph_4_deyon'   => $v["pph_4_deyon"],
        'pph_4_tenant'  => $v["ppn"],
        'no_p_l_tenant' => $v["no_potong_dan_lapor_tenant"],
        'bukpot_oleh_tenant'=> $v["bukti_potong_oleh_tenant"],
        'tgl_p_l_penyewa'   => $tgl_p_l_penyewa_format,
        'pph_p_l_tenant'=> $v["pph_potong_dan_lapor_tenant"],
        'note'  => $v["note"],
        'checklist' => $v["checklist"],
        'selisih'   => $selisih,
    ];

    $insertData[] = Data::firstOrCreate($insert);
}
  

нет другого способа, кроме как перебирать большой массив

Комментарии:

1. переменная $ insert должна быть массивом типа $insert[], потому что она находится в каждом массиве, если я выполню ваше предложение, в базу данных будут вставлены только одни данные

2. Я обновил свой ответ, пожалуйста, проверьте его и дайте мне знать, если вам нужна более подробная информация