未找到列:1054'字段列表'中的未知列'0' - Laravel - 我的代码

时间:2016-03-17 16:09:22

标签: php mysql laravel laravel-5

我遇到了这个奇怪的错误:

  

SQLSTATE [42S22]:未找到列:1054“字段列表”中的未知列“0”(SQL:更新forum_threads设置0 =已锁定,1 = 1,{ {1}} = 2016-03-17 16:01:59其中updated_at = 3且topic_idforum_threads为空)

问题是,我没有0列。我的代码中没有deleted_at的where子句。我正在使用范围查询。

我的控制器是:

0

如你所见,我做得不多。我只是想锁定一个线程。我在我的 $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()

就是这样。我想这可能是因为我有一个从我的控制器(public function scopeLock($query) { return $query->where('locked', 0)->update(['locked', 1]); } )传递的where子句,我只是继续它到我的范围。

非常感谢任何帮助。

4 个答案:

答案 0 :(得分:29)

错误归因于->update(['locked', 1]);应为->update(['locked' => 1]);

更新函数使用数组作为"列" => "值",您的语法错误导致Laravel认为[ 0 => 'locked', 1 => 1],因此它转换为此SQL SET 0 = 'locked', 1 = 1 ...

答案 1 :(得分:3)

正如我在评论部分中提到的,将您的功能更改为:

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

请注意更新方法中的更改。

答案 2 :(得分:0)

我在哪里有双重病情

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

我修复了在两种情况下都添加括号的问题

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

答案 3 :(得分:-2)

在我的案例中,问题出在模型属性中,我使用受保护的$ fillable,保护$ foreignKey和受保护的$ timestamp。为了解决问题,我将所有属性都放在了$ fillable变量中。