191 votes

Création et mise à jour de Laravel Eloquent

Quelle est l'abréviation pour insérer un nouvel enregistrement ou mettre à jour un enregistrement existant ?

<?php

$shopOwner = ShopMeta::where('shopId', '=', $theID)
    ->where('metadataKey', '=', 2001)->first();

if ($shopOwner == null) {
    // Insert new record into database
} else {
    // Update the existing record
}

7voto

Sasa Blagojevic Points 719

Si vous avez besoin de la même fonctionnalité en utilisant le DB dans Laravel >= 5.5 que vous pouvez utiliser :

DB::table('table_name')->updateOrInsert($attributes, $values);

ou la version abrégée lorsque $attributes y $values sont les mêmes :

DB::table('table_name')->updateOrInsert($values);

6voto

malcolmhall Points 1909
$shopOwner = ShopMeta::firstOrNew(array('shopId' => $theID,'metadataKey' => 2001));

Effectuez ensuite vos modifications et enregistrez. Notez que firstOrNew n'effectue pas l'insertion s'il n'est pas trouvé, si vous en avez besoin, c'est firstOrCreate.

4voto

Mahdi Bashirpour Points 1406

Comme la méthode firstOrCreate, updateOrCreate fait persister le modèle, donc il n'y a pas besoin d'appeler save()

// If there's a flight from Oakland to San Diego, set the price to $99.
// If no matching model exists, create one.

$flight = App\Flight::updateOrCreate(
   ['departure' => 'Oakland', 'destination' => 'San Diego'],
   ['price' => 99]
);

Et pour votre question

$shopOwner = ShopMeta::updateOrCreate(
   ['shopId' => $theID, 'metadataKey' => '2001'],
   ['other field' => 'val' ,'other field' => 'val', ....]
);

2voto

vivoconunxino Points 2613

Une option supplémentaire si votre identifiant n'est pas auto-incrémenté et que vous savez lequel insérer/mettre à jour :

$object = MyModel::findOrNew($id);
//assign attributes to update...
$object->save();

1voto

Juancho Ramone Points 1102

En fait, firstOrCreate ne serait pas mise à jour dans le cas où le registre existe déjà dans la base de données. J'ai un peu amélioré la solution d'Erik car j'avais besoin de mettre à jour une table qui a des valeurs uniques et pas seulement pour la colonne "id".

/**
 * If the register exists in the table, it updates it. 
 * Otherwise it creates it
 * @param array $data Data to Insert/Update
 * @param array $keys Keys to check for in the table
 * @return Object
 */
static function createOrUpdate($data, $keys) {
    $record = self::where($keys)->first();
    if (is_null($record)) {
        return self::create($data);
    } else {
        return self::where($keys)->update($data);
    }
}

Alors tu l'utiliserais comme ça :

Model::createOrUpdate(
        array(
    'id_a' => 1,
    'foo' => 'bar'
        ), array(
    'id_a' => 1
        )
);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X