DevonDahon
DevonDahon

Reputation: 8350

How to increment column with Laravel Eloquent updateOrCreate()?

Is it possible to return the model id from the request below ?

Bar::insert([
  'foo_id' => Foo::updateOrCreate([
    'code' => $row[0],
    'name' => $row[1]
  ])->increment('count')->id
]);

I also tried this:

Foo::updateOrCreate([
  'code' => $row[0],
  'name' => $row[1]
], [
  'count' => DB::raw('count + 1')
])->id

But it doesn't work at inserting because it count is not yet set.

HINT: There is a column named "count" in table "foos", but it cannot be referenced from this part of the query. (SQL: insert into "public"."foos" ("id", "name", "count") values (123, Hello, count+1) returning "id")

=== EDIT ===

With DB::raw('IFNULL(count,0) + 1'), I'm getting:

  SQLSTATE[42703]: Undefined column: 7 ERROR:  column "count" does not exist
LINE 1: ... ("code", "name", "count") values ($1, $2, IFNULL(count,0) +...
                                                             ^
HINT:  There is a column named "count" in table "foos", but it cannot be referenced from this part of the query. (SQL: insert into "public"."foos" ("code", "name", "count") values (123, Hello, IFNULL(count,0) + 1) returning "id")

Upvotes: 0

Views: 1921

Answers (3)

OMR
OMR

Reputation: 12188

try using IFNULL

Foo::updateOrCreate([
  'code' => $row[0],
  'name' => $row[1]
], [
  'count' => DB::raw('IFNULL(count,0) + 1')
])

if you want the id, try it like this:

$id=(Foo::updateOrCreate([
  'code' => $row[0],
  'name' => $row[1]
], [
  'count' => DB::raw('IFNULL(count,0) + 1')
]))->id;

note: this is working on mysql, not PostgreSQL

Upvotes: 1

apokryfos
apokryfos

Reputation: 40653

Unfortunately I don't think this is possible to reference the count column only when the update happens (since this is what is happening here). You will need to take the roundabout way:

   $model = Foo::firstOrNew([
      'code' => $row[0],
      'name' => $row[1]
   ]);
   $model->count = ($model->exists ? $model->count : 0) + 1; 
   $model->save();

Here $model->exists will be true if the model was retrieved from the database or false if a new one was created.

Efficiency-wise firstOrCreate is what updateOrCreate does anyway so there's no query cost added

Upvotes: 2

Mustafa Goda
Mustafa Goda

Reputation: 109

you just need to set column auto-increment in database and not need set it column in your eloquent

Upvotes: 0

Related Questions