创建自定义密码重置时出现未知列错误-Laravel

时间:2018-07-07 15:18:35

标签: php laravel

它必须做什么:

我正在尝试使用Laravel从头开始创建自己的密码重置。 我有一个password_resets表,该表具有3列:email,token,created_at。 我让用户输入要将密码重置邮件发送到的电子邮件。 用户输入电子邮件后,我的ResetController中的“发送”功能将检查用户表中是否存在电子邮件ID。 如果存在,那么将创建一个令牌,然后将电子邮件和令牌存储在password_resets表中。 然后,将恢复邮件发送到带有重置密码的链接的电子邮件地址。

哪里出了错

当我尝试将数据保存到password_resets表时,laravel抛出此错误:

  

SQLSTATE [42S22]:找不到列:1054'字段列表'中的未知列'updated_at'(SQL:插入password_resetsupdated_atcreated_at)值中(2018- 07-07 13:11:15,2018-07-07 13:11:15))

但是我的password_resets表中没有updated_at列

下面是password_resets表的结构:

  

给varchar(191)发送电子邮件-    令牌varchar(191)-    created_at时间戳

我的ResetController文件:

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

use App\User;
use App\PasswordReset;

class ResetController extends Controller
{
  public function show() 
  {
    return view('reset.index');
  }

  public function send() 
  {
        $email = request('resetemail');

        if(User::get()->where('email','lol@lol.com')!=null)
        {
            $token = bin2hex(openssl_random_pseudo_bytes(16));

            PasswordReset::create([
            'email'=> $email,
            'token'=> $token
            ]);
        }
   }  
 }

2 个答案:

答案 0 :(得分:1)

根据Eloquent Model Conventions

  

默认情况下,Eloquent希望created_atupdated_at列   存在于您的桌子上。如果您不希望有这些列   由Eloquent自动管理,将$timestamps属性设置为   您的模型为假:

因此,您可以通过在模型中添加public $timestamps = false;来解决问题。

或者,您可以通过向迁移中添加$table->timestamps();并将其推出来将时间戳记字段添加到表中。请参阅Laravel文档中的可用列类型 creating columns

答案 1 :(得分:0)

如果设置 public $timestamps = false;,则将 created_at 和 updated_at 值设置为 null。 如果您想为这些字段(created_at、updated_at)单独设置值,那么有一个解决方案。

解决方案 1: 您有 created_at 列但没有 update_at 您可以简单地在模型中将 updated_at 设置为 null

class ABC extends Model {

const UPDATED_AT = null;

解决方案 2:您同时拥有 created_at 和 updated_at 列,但列名不同

class ABC extends Model {

const CREATED_AT = 'name_of_created_at_column';
const UPDATED_AT = 'name_of_updated_at_column';

解决方案 3: 两个字段都为空

class ABC extends Model {

public $timestamps = false