94

I need to update all of the rows in a database so that a particular field in all of them is equal to a single value. Here's an example.

Let's say my database table is like so:

id data confirmed
1 someData 0
2 someData 1
3 someData 0

I want to perform a query that sets the confirmed field of every row to 1.

I could do it this way:

$rows = MyModel::where('confirmed', '=', '0')->get();
foreach($rows as $row) {
    $row->confirmed = 0;
    $row->save();
}

But it seems like there would be a better way? A single query that would just say "set every row's 'confirmed' field to 1."

Does such a query exist in Laravel's Eloquent/Fluent?

Anil Parshi
  • 875
  • 5
  • 21
Pete
  • 7,289
  • 10
  • 39
  • 63

9 Answers9

177

Just to keep this thread current, you can update all rows against an Eloquent model directly using:

Model::query()->update(['confirmed' => 1]);

If you are using something like WHERE

Model::where('foo', '=', 'bar')->update(['confirmed' => 1])

If you want to include soft deleted rows as well

Model::query()->withTrashed()->update(['confirmed' => 1]);
Serjas
  • 2,184
  • 4
  • 21
  • 35
Matt
  • 2,360
  • 1
  • 17
  • 10
  • 4
    This is what I'm looking for! Thanks! – Muhammad Zamroni Jan 17 '18 at 06:16
  • 10
    I prefer to using Eloquent. this must be the answer – Cong LB Dec 25 '18 at 01:22
  • 6
    This is the best way to do it. Just to add some explanation for the `query()` part, if you were doing something like `Model::where('foo', '=', 'bar')->update(['confirmed' => 1])` you wouldn't need the `query()` part. But to update all rows without a `where()`, the `query()` is needed to get the query builder object. – orrd May 14 '20 at 19:35
  • 2
    Note that this is different from `DB::table('table')` in that this doesn't take soft-deleted rows into account! For that you can use: `Model::query()->withTrashed()->update(['confirmed' => 1]);` – Arno van Oordt Jan 21 '21 at 08:55
  • The accepted answer says "no, you can't with eloquent" which does not seem to be the case after this answer.. – supersan Jan 09 '23 at 10:55
102

Well, an easy answer: no, you can't with eloquent. A model represents 1 row in the database, it wouldn't make sense if they implemented this.

However, there is a way to do this with fluent:

$affected = DB::table('table')->update(array('confirmed' => 1));

or even better

$affected = DB::table('table')->where('confirmed', '=', 0)->update(array('confirmed' => 1));
LHolleman
  • 2,486
  • 2
  • 18
  • 19
  • 2
    This works, but the newer answer by Matt is little bit cleaner way to do it since that answer uses Eloquent so you don't have to be dependent on knowing the table name and resorting to the database builder functions. – orrd May 14 '20 at 19:32
28

You can do this with elquent (laravel 4):

MyModel::where('confirmed', '=', 0)->update(['confirmed' => 1])
styryl
  • 281
  • 3
  • 2
3

This working for me :

   MyModel::query()->update(  ['confirmed' => 1] );
Abd Abughazaleh
  • 4,615
  • 3
  • 44
  • 53
2

Model::where('confirmed', 0)->update(['confirmed' => 1])

Faran
  • 138
  • 6
1

Solution for updating all rows :

  1. Create an extra column ( like 'updateAll') and assign static value for all rows (like this 'updateAll' = '1' ) in mysql table.

  2. Add hidden input field with name="forUpdateAll" and value="forUpdateAllValue" ( to execute only specific code for updating all rows)

  3. Then for update(Request $request, $id) method add this code :
public function update(Request $request, $id){
      if($request->get('forUpdateAll') == "forUpdateAllValue"){
                 $question = \App\YourModel::where('updateAll',$id)
                     ->update([
                         'confirmed' => 1
                     ]);

      }else {
          //other code ( update for unique record ) 
      }
 }
  1. Setup your form like this :
<form role="form" action="/examples/1" method="post">        
      {{ method_field('PATCH') }}
      {{ csrf_field()}}
      <input type="hidden" name="forUpdateAll" value="forUpdateAllValue">  
      <button type="submit" class="btn btn-primary">Submit</button>
  </form>
1

Update any column fileds

DB::table('your_table_name')->update(['any_column_name' => 'any value']);
MRMP
  • 303
  • 2
  • 5
0

Update all fields using laravel eloquent:

Way -> 1

[Status-> Columns you want to update]

Model::where('status', '=', 1)->update(['status' => 0]);

Way -> 2

[Status-> Columns you want to update]

$allData = Model::where('status', 1)->get();
                foreach ($allData as $data){
                    $data->status= 0;
                    $data->update();
                }
Maizied Hasan Majumder
  • 1,197
  • 1
  • 12
  • 25
-8

You can do this to update all the records.

App\User::where('id', 'like', '%')->update(['confirmed' => 'string']);