Pete
Pete

Reputation: 7599

How to set every row to the same value with Laravel's Eloquent/Fluent?

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?

Upvotes: 97

Views: 120120

Answers (9)

Matt
Matt

Reputation: 2420

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]);

Upvotes: 183

Maizied Hasan Majumder
Maizied Hasan Majumder

Reputation: 1053

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();
                }

Upvotes: 0

Abd Abughazaleh
Abd Abughazaleh

Reputation: 5555

This working for me :

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

Upvotes: 3

MRMP
MRMP

Reputation: 313

Update any column fileds

DB::table('your_table_name')->update(['any_column_name' => 'any value']);

Upvotes: 1

Faran
Faran

Reputation: 138

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

Upvotes: 2

Ihtisham Hussain
Ihtisham Hussain

Reputation: 21

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>

Upvotes: 1

Sambit Mohapatra
Sambit Mohapatra

Reputation: 153

You can do this to update all the records.

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

Upvotes: -8

styryl
styryl

Reputation: 281

You can do this with elquent (laravel 4):

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

Upvotes: 28

LHolleman
LHolleman

Reputation: 2596

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));

Upvotes: 103

Related Questions