web-dev-qa-db-fra.com

Mettre à jour le tableau et ajouter des données dans un Laravel 5 migration

J'ai besoin d'ajouter une nouvelle colonne dans mon projet laravel, pas de problème, j'ai utilisé Schema::table() pour mettre à jour et tout va bien. Maintenant, je dois savoir combien d'enregistrements j'ai sur cette table et mettre à jour avec une valeur.

J'ai la table Warrants:

Schema::create('warrant_grants', function(Blueprint $table) {
    $table->increments('id');
    $table->integer('warrant_plan_id');
    $table->integer('shareholder_id');
});

J'ai donc créé le nouveau champ avec un nouveau fichier de migration:

Schema::table('warrant_grants',function ($table) {
    $table->string('name',100);
});

Maintenant, je dois mettre à jour ce champ name dans la table avec certaines valeurs, par exemple si la table a 100 enregistrements, alors je dois insérer dans chaque ligne la valeur "warrant-X" où X est un nombre commençant de 1 à 100. Par exemple:

Warrant-1, warrant-2, .... warrant-100.

J'ai passé des heures à chercher un moyen de faire cela en utilisant Seeds mais je n'ai pas trouvé. Donc, fondamentalement, j'ai deux questions:

  • Puis-je utiliser Seeds dans Laravel 5 pour mettre à jour les valeurs ou simplement les insérer?
  • Puis-je créer du SQL dans Seeds (ou migrations) pour effectuer cette mise à jour pour moi?
13
Deric Lima

Sur la base de ce lien, j'ai trouvé la réponse: https://stackoverflow.com/a/23506744/4650792

Schema::table('warrant_grants',function ($table){
        $table->string('name',100)->after('id')->nullable();
    });

    $results = DB::table('warrant_grants')->select('id','name')->get();

    $i = 1;
    foreach ($results as $result){
        DB::table('warrant_grants')
            ->where('id',$result->id)
            ->update([
                "name" => "Warrant-".$i
        ]);
        $i++;
    }

Merci pour l'aide quand même les gars.

8
Deric Lima

Oui, vous pouvez effectuer des mises à jour/des insertions/n’importe quoi dans vos migrations. Par exemple:

Schema::table('warrant_grants', function($table) {
    $table->string('name', 100);
});

$i = 1;
foreach (WarrantGrants::all() as $warrant_grant) {
    $warrant_grant->update([
      'name' => 'Warrant-' . $i
    ]);

    $i++;
}
7

Les autres réponses sont correctes. Notez toutefois que si vous avez beaucoup d’enregistrements, leur mise à jour avec ORM peut prendre du temps. Utilisez des requêtes SQL brutes pour le faire plus rapidement.

Schema::table('warrant_grants',function ($table){
        $table->string('name',100)->after('id')->nullable();
    });
DB::raw("UPDATE warrant_grants SET name=name+id");

La requête SQL n'est pas exacte et vous devez la créer pour votre propre base de données, mais vous obtenez le point.

4
vfsoraki

Une autre syntaxe possible pour y parvenir:

DB::table('warrant_grants')
   ->where('id',$result->id)
   ->update([
      "name" => DB::raw("'Warrant-' + `name`")
   ]);

Cela permet à la mise à jour d'être effectuée en un seul lot plutôt que d'itérer les résultats, et de conserver la plupart des syntaxes Eloquent bien connues, plutôt que de se contenter d'utiliser du SQL brut.

La syntaxe de concaténation de chaînes devra peut-être être modifiée en fonction de la variante SQL utilisée. 

0
rh16