ChatGPT解决这个技术问题 Extra ChatGPT

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?


M
Matt

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

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

This is what I'm looking for! Thanks!
I prefer to using Eloquent. this must be the answer
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.
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]);
L
LHolleman

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

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.
s
styryl

You can do this with elquent (laravel 4):

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

I
Ihtisham Hussain

Solution for updating all rows :

Create an extra column ( like 'updateAll') and assign static value for all rows (like this 'updateAll' = '1' ) in mysql table. Add hidden input field with name="forUpdateAll" and value="forUpdateAllValue" ( to execute only specific code for updating all rows) 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 ) 
      }
 }

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>

M
MRMP

Update any column fileds

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

F
Faran

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


A
Abd Abughazaleh

This working for me :

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

S
Sambit Mohapatra

You can do this to update all the records.

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