我收到这个奇怪的错误:
SQLSTATE[42S22]:未找到列:1054“字段列表”中未知列“0”(SQL:更新
设置forum_threads
=锁定,0
=1,1
=2016-03-17 16:01:59 其中updated_at
= 3 且topic_id
。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)
),并且我只是将其继续到我的范围中。
非常感谢任何帮助。
错误是由于
->update(['locked', 1]);
造成的,应该是 ->update(['locked' => 1]);
更新函数使用数组作为“列”=>“值”,你的语法错误导致Laravel认为
[ 0 => 'locked', 1 => 1]
,所以它翻译成这个SQLSET 0 = 'locked', 1 = 1
...
正如我在评论部分提到的,将你的函数更改为:
public function scopeLock($query)
{
return $query->where('locked', 0)->update(['locked' => 1]);
}
注意更新方法的变化。
我在 WHERE 中有双重条件
ContestPool::where(['contest_id', '=', $contest_id], ['user_id', '=', $user_id])->delete();
我修复了为这两个条件添加括号的问题
ContestPool::where([['contest_id', '=', $contest_id], ['user_id', '=', $user_id]])->delete();
就我而言,问题是 $attributes,我有
protected $attributes = ['my_attribute'];
,但我没有该属性的方法
就我而言,问题出在模型属性中。我使用受保护的 $fillable、保护 $foreignKey、受保护的 $timestamp。为了解决这个问题,我将所有属性放在 protected $fillable 变量中。