#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. Я обновил свой ответ, пожалуйста, проверьте его и дайте мне знать, если вам нужна более подробная информация