Usare ON DUPLICATE KEY UPDATE in Laravel
Lo ammetto, sono un grandissimo amante dell'istruzione ON DUPLICATE KEY UPDATE di MariaDB/MySQL.
In Laravel possiamo usare la funzione upsert di Eloquent per ottenere lo stesso risultato.
Dovrebbe essere compatibile almeno con le versioni 9 e 10 di Laravel; e da quello che ho capito, upsert funziona anche con altri db che non hanno questa istruzione.
Questo perchè, in sostanza, upsert va a cercare le chiavi univoche indicate, e se trova un valore duplicato va in update dei campi segnalati.
Detto ciò, partiamo dal mio model:
class Fornitore extends Model {
protected $table = 'fornitori';
public $timestamps = false;
protected $primaryKey = 'forn_id';
public $incrementing = true;
protected $fillable = [
'forn_id',
'forn_codice',
'forn_nome',
'forn_data_aggiunta',
'forn_data_modifica'
];
}
Questa invece la funzione nel controller; considerato che invio i dati in formato JSON:
class FornitoriController extends Controller {
public function add(Request $req) {
$data = $req->json()->all();
if (!empty($data)) {
try {
$today = date("Y-m-d H:i:s");
Fornitore::upsert(
[
'forn_codice' => trim($data['forn_codice']),
'forn_nome' => trim($data['forn_nome']),
'forn_data_aggiunta' => $today,
'forn_data_modifica' => $today
],
['forn_codice'],
['forn_nome', 'forn_data_modifica'],
);
} catch (QueryException $ex) {
return response()->json([
'res' => 'ko',
'message' => $ex->getMessage()
]);
}
return response()->json(array(
"res" => "ok",
"message" => 'Operazione avvenuta con successo!'
));
} else {
return response()->json(array(
"res" => "ko",
"message" => "Dati mancanti!"
));
}
}
}
La funzione upsert richiede tre parametri di tipo array:
- i valori che verranno inviati al db
- i campi che sono chiavi univoche da ricercare (nel mio caso solo uno)
- i campi che devono essere modificati nel caso venga trovata una corrispondenza
Enjoy!
php laravel eloquent upsert database
Commentami!