Home » Php » Column not found: 1054 Unknown column '0' in 'field list' – Laravel – I don't have a 0 column anywhere in my code

Column not found: 1054 Unknown column '0' in 'field list' – Laravel – I don't have a 0 column anywhere in my code

Posted by: admin November 29, 2017 Leave a comment

Questions:

I’m getting this weird error:

SQLSTATE[42S22]: Column not found: 1054 Unknown column ‘0’ in ‘field list’ (SQL: update forum_threads set 0 = locked, 1 = 1, updated_at = 2016-03-17 16:01:59 where topic_id = 3 and forum_threads.deleted_at is null)

The thing is, I don’t have a 0 column. I don’t have a where clause with a 0 anywhere in my code. I am using a scope query.

My controller is:

    $action = $request->input('action');
    $topic = $request->input('topic');
    $thread = Thread::where('topic_id', $topic);

    switch ($action) {
        case ('locked'):
            $thread->lock();
            break;
    }

As you can see, I don’t do much. I am just trying to lock a thread. I am calling the lock scope in my Thread model. I have a lot of switch cases, one of which is lock. I have run half of the query at the top so I don’t have to repeat myself. I simply stored it in the $thread variable so that I can perform actions like $thread->delete() and $thread->restore().

My query scope in Thread model:

public function scopeLock($query)
{
    return $query->where('locked', 0)->update(['locked', 1]);
}

That’s it. I think it may because I have a where clause passing from my controller (Thread::where('topic_id', $topic)) and I’m just continuing it onto my scope.

Any help is highly appreciated.

Answers:

The error is due to ->update(['locked', 1]); which should be ->update(['locked' => 1]);

the update function uses an array as “column” => “value”, your syntax error causes Laravel to think [ 0 => 'locked', 1 => 1], so it translates to this SQL SET 0 = 'locked', 1 = 1

Questions:
Answers:

As I mentioned in the comment section, change your function to this:

public function scopeLock($query)
{
    return $query->where('locked', 0)->update(['locked' => 1]);
}

Note the changes in the update method.