未找到列:1054“字段列表”中的未知列“0” - Laravel - 我的代码中的任何位置都没有 0 列

问题描述 投票:0回答:5

我收到这个奇怪的错误:

SQLSTATE[42S22]:未找到列:1054“字段列表”中未知列“0”(SQL:更新

forum_threads
设置
0
=锁定,
1
=1,
updated_at
=2016-03-17 16:01:59 其中
topic_id
= 3 且
forum_threads
deleted_at
为空)

问题是,我没有 0 列。我的代码中的任何地方都没有带有

0
的 where 子句。我正在使用范围查询。

我的控制器是:

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

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

如你所见,我做的事情并不多。我只是想锁定一个线程。我在我的

Thread
模型中调用锁定范围。我有很多开关盒,其中之一是
lock
。我已经在顶部运行了一半的查询,因此我不必重复自己。我只是将其存储在
$thread
变量中,以便我可以执行
$thread->delete()
$thread->restore()
等操作。

我在Thread模型中的查询范围:

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

就是这样。我认为这可能是因为我有一个从我的控制器传递的 where 子句 (

Thread::where('topic_id', $topic)
),并且我只是将其继续到我的范围中。

非常感谢任何帮助。

php mysql laravel laravel-5
5个回答
87
投票

错误是由于

->update(['locked', 1]);
造成的,应该是
->update(['locked' => 1]);

更新函数使用数组作为“列”=>“值”,你的语法错误导致Laravel认为

[ 0 => 'locked', 1 => 1]
,所以它翻译成这个SQL
SET 0 = 'locked', 1 = 1
...


3
投票

正如我在评论部分提到的,将你的函数更改为:

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

注意更新方法的变化。


2
投票

我在 WHERE 中有双重条件

ContestPool::where(['contest_id', '=', $contest_id], ['user_id', '=', $user_id])->delete();

我修复了为这两个条件添加括号的问题

ContestPool::where([['contest_id', '=', $contest_id], ['user_id', '=', $user_id]])->delete();

0
投票

就我而言,问题是 $attributes,我有

protected $attributes = ['my_attribute'];
,但我没有该属性的方法


-2
投票

就我而言,问题出在模型属性中。我使用受保护的 $fillable、保护 $foreignKey、受保护的 $timestamp。为了解决这个问题,我将所有属性放在 protected $fillable 变量中。

© www.soinside.com 2019 - 2024. All rights reserved.