首页 > 解决方案 > Laravel SQLSTATE [42S22]:找不到列:1054 Unknown column '0' in

问题描述

我正在开发一个 Laravel 博客,而此刻,我想使用事件根据特定条件更改 Post 状态的状态。在我的迁移中,我有一个 post_status 枚举表,其中包含我想要使用的状态,我已经连接了事件和侦听器,还使用检索设置了 dispatchesEvents,所以我并没有真正发布任何内容。

我想将当前状态为“完成”且超过 90 天的帖子更改为“已归档”状态。为此,我使用下面的代码。状态实际上是根据第一个条件更新的,但我不确定是否考虑了第二个条件(或者是否正确定义),我的直觉是问题出在最后一行。这是监听器中的代码:

public function handle(PostStatusUpdaterEvent $event)
{
  $old_date = Carbon::now()->subDays(90);

  Post::where(['post_status' => 3]) // 3 = Complete status
      ->where(['end_date', '<', $old_date]) 
      ->update(['post_status' => 4]); // 4 = Archived status

}

和错误:

lluminate\Database\QueryException
SQLSTATE[42S22]: Column not found: 1054 Unknown column '0' in 'where clause' (SQL: update 
`posts` set `post_status` = 4, `posts`.`updated_at` = 2020-02-24 13:13:15 where 
(`post_status` = 3) and (`0` = end_date and `1` = < and `2` = 2019-11-26 13:13:15))

我在受保护的可填充数组中有 post_status 字段,并且表本身也受到保护。还尝试在受保护的追加数组中设置 post_status 字段,还尝试将表 id 设置为隐藏,但均无效。最后,我在侦听器中导入了模型和 Carbon 命名空间(如使用中...)

标签: laravel

解决方案


仅当您想在同一个 where 中运行多个检查时,您才会在 where 中使用数组 WHERE (`post_status` = 3 AND `end_date` = '2019-11-26 13:13:15')

正确的代码是

Post::where([
        ['post_status', 3], // 3 = Complete status
        ['end_date', '<', $old_date],
    ]) 
    ->update(['post_status' => 4]); // 4 = Archived status

生产WHERE `post_status` = 3 AND `end_date` < '2019-11-26 13:13:15'
你会去(没有数组概念)

Post::where('post_status', 3) // 3 = Complete status
    ->where('end_date', '<', $old_date)
    ->update(['post_status' => 4]); // 4 = Archived status

有关更多信息,请参见Where 子句


推荐阅读