Update table and add data in a Laravel 5 Migration

36,977

Solution 1

Based on this link i found the answer: 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++;
    }

Thanks for the help anyway guys.

Solution 2

Other answers are correct. But note that if you have a lot of records, updating all of them with ORM can take time. Use raw SQL queries to do that faster.

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

The SQL query is not exact, and you have to make it for your own DB, but you get the point.

Solution 3

Yes, you can perform updates/inserts/whatever in your migrations. For example:

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++;
}

Solution 4

Another possible syntax to achieve this:

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

This allows the update to be done as one batch rather than iterating over results, and retains most of the familiar Eloquent syntax rather than falling back to just using raw SQL.

The string concatenation syntax may need to be changed depending on the SQL variant used.

Share:
36,977
Deric Lima
Author by

Deric Lima

A unusual coder that loves the explore the world and live the samurai lifestyle. Knowledge is power.

Updated on February 11, 2020

Comments

  • Deric Lima
    Deric Lima about 4 years

    I need to add a new column in my laravel Project, no problem for this, I used the Schema::table() to update and it's ok. Now I need to find out how many records I have on this table and update with some value.

    I have the table Warrants:

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

    So I created the new field with a new migration file:

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

    Now I need to update this field name in the table with some values, for example if the table has 100 records, then I need to insert in every row the value "Warrant-X" where X is a number starting with 1 to 100. For example:

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

    I spent hours looking for some way to do this using Seeds but I didn't found. So basically i have two questions:

    • Can I use Seeds in Laravel 5 to update values or I can just insert them?
    • Can I create some SQL inside the Seeds (or migrations) to do this update for me?