Usare ON DUPLICATE KEY UPDATE in Laravel

Mattepuffo's logo
Usare ON DUPLICATE KEY UPDATE in Laravel

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!


Condividi

Commentami!