[Php] Insérer un nouvel enregistrement s'il n'existe pas et mettre à jour s'il existe, laravel éloquent


Answers

Mise à jour: 27 août 2014 - [ updateOrCreate Construit dans le noyau ...]

Juste au cas où les gens rencontreraient encore ça ... J'ai découvert quelques semaines après avoir écrit ceci, que c'est en fait une partie du noyau d'Eloquent de Laravel ...

Creuser dans la (les) méthode (s) équivalente (s) d'Eloquent. Vous pouvez voir ici:

https://github.com/laravel/framework/blob/4.2/src/Illuminate/Database/Eloquent/Model.php#L553

sur: 570 et: 553

    /**
     * Create or update a record matching the attributes, and fill it with values.
     *
     * @param  array  $attributes
     * @param  array  $values
     * @return static
     */
    public static function updateOrCreate(array $attributes, array $values = array())
    {
        $instance = static::firstOrNew($attributes);

        $instance->fill($values)->save();

        return $instance;
    }

Vieille réponse ci-dessous

Je me demande s'il existe une fonctionnalité L4 intégrée pour le faire d'une manière ou d'une autre, par exemple:

$row = DB::table('table')->where('id', '=', $id)->first();
// Fancy field => data assignments here
$row->save();

J'ai créé cette méthode il y a quelques semaines ...

// Within a Model extends Eloquent
public static function createOrUpdate($formatted_array) {
    $row = Model::find($formatted_array['id']);
    if ($row === null) {
        Model::create($formatted_array);
        Session::flash('footer_message', "CREATED");
    } else {
        $row->update($formatted_array);
        Session::flash('footer_message', "EXISITING");
    }
    $affected_row = Model::find($formatted_array['id']);
    return $affected_row;
}

J'espère que cela aide. J'aimerais voir une alternative à cela si quelqu'un en a un à partager. @erikthedev_

Question

Y at-il un raccourci pour nous d'insérer un nouvel enregistrement s'il n'existe pas et mettre à jour l'enregistrement s'il existe? ce qui suit est le code que j'utilise.

$shopOwner = ShopMeta::where('shopId', '=', $theID)->where('metadataKey', '=', 2001)->first();
if ($shopOwner==null){
    insert new record into database
} else {
    update the existing record
}

Merci




Enregistrer la fonction:

$shopOwner->save()

fais déjà ce que tu veux ...

Code Laravel:

    // If the model already exists in the database we can just update our record
    // that is already in this database using the current IDs in this "where"
    // clause to only update this model. Otherwise, we'll just insert them.
    if ($this->exists)
    {
        $saved = $this->performUpdate($query);
    }

    // If the model is brand new, we'll insert it into our database and set the
    // ID attribute on the model to the value of the newly inserted row's ID
    // which is typically an auto-increment value managed by the database.
    else
    {
        $saved = $this->performInsert($query);
    }



En fait, firstOrCreate ne se mettrait pas à jour si le registre existe déjà dans la base de données. J'ai amélioré un peu la solution d'Erik car j'avais réellement besoin de mettre à jour une table qui a des valeurs uniques non 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);
    }
}

Ensuite, vous l'utiliseriez comme ceci:

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



Comme la méthode firstOrCreate, updateOrCreate persiste le modèle, il n'est donc pas nécessaire 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 problème

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



vérifier si un utilisateur existe ou non. Si non insérer

$exist = DB::table('User')->where(['username'=>$username,'password'=>$password])->get();
if(count($exist)  >0) {
    echo "User already exist";;
}
else  {
    $data=array('username'=>$username,'password'=>$password);
    DB::table('User')->insert($data);
}
Laravel 5.4           



Une option de plus 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();



Links