Php Laravel 5模型未将指定字段插入数据库

Php Laravel 5模型未将指定字段插入数据库,php,laravel,laravel-5,laravel-5.1,Php,Laravel,Laravel 5,Laravel 5.1,我正在尝试将验证码添加到我的所有模型中,但出现以下错误: SQLSTATE[42S22]: Column not found: 1054 Unknown column 'captcha' in 'field list' (SQL: insert into `deposit_records` (`reference_number`, `deposit_amount`, `deposit_datetime`, `deposit_reference`, `reward_method`, `captch

我正在尝试将验证码添加到我的所有模型中,但出现以下错误:

SQLSTATE[42S22]: Column not found: 1054 Unknown column 'captcha' in 'field list' (SQL: insert into `deposit_records` (`reference_number`, `deposit_amount`, `deposit_datetime`, `deposit_reference`, `reward_method`, `captcha`, `bank_id`, `deposit_bank`, `deposit_bank_holder`, `deposit_bank_account`, `user_id`, `updated_at`, `created_at`) 
我正在扩展将在保存之前自动验证的自定义模型类,下面是BaseModel.php文件

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use Validator;

class BaseModel extends Model {

    /**
     * Listen for save event
     *
     * @return void
     */
    public static function boot() {
        parent::boot();

        static::creating(function($model) {
            return $model->validate();
        });

        static::updating(function($model) {
            return $model->validate();
        });

        static::saving(function($model) {
            return $model->validate();
        });
    }

    /**
     * Validates current attributes against rules
     *
     * @return boolean
     */
    public function validate() {
        $rules = property_exists($this, 'rules') ? static::$rules : array();
        $messages = property_exists($this, 'messages') ? static::$messages : array();

        if (!empty($rules)) {
            $replace = ($this->getKey() > 0) ? $this->getKey() : null;
            foreach ($rules as $key => $rule) {
                $rules[$key] = str_replace(':id', $replace, $rule);
            }

            $validation = Validator::make($this->attributes, $rules, $messages);
            if ($validation->fails()) {
                $this->errors = $validation->messages();

                return false;
            }
        }

        return true;
    }

    public function error()
    {
        return $this->errors ? $this->errors : null;
    }

    public function errors()
    {
        return $this->errors ? $this->errors : null;
    }

}
但是在我添加了数据库中不存在的额外字段之后,它会保留未找到字段的错误,但是我不知道如何在不删除自动验证的情况下解决这个问题,自动验证很有用,并且节省了很多时间

在Laravel4.1中,我可以像下面这样做

//Deposit Model
public function beforeSave() {
    unset($this->{"g-recaptcha-response"});
    unset($this->gRecaptchaResponse);
}

我最终使用不同的方法,删除模型中的captcha规则,在中间件上验证它

<?php

namespace App\Http\Middleware;

use Closure;
use Sentinel;
use Input;

class VerifyCaptcha
{
    public function handle($request, Closure $next)
    {
        if ((Input::has('captcha') && Input::get('captcha') != '') && (Input::has('captchaHash') && Input::get('captchaHash') != ''))
        {
            if (rpHash(Input::get('captcha')) == Input::get('captchaHash')) {
                return $next($request);
            } else {
                return $this->errorResponse($request, 2);
            }
        } else {
            return $this->errorResponse($request, 1);
        }
    }

    public function errorResponse($request, $error) {
        switch ($error) {
            case 1:
                $msg = 'Please keyin the captcha code first';
                break;
            case 2:
                $msg = 'Wrong captcha code';
                break;
            default:
                $msg = 'Unknown error, please refresh and try again';
                break;
        }
        if ($request->ajax()) {
            return makeJSONResponse(false, $msg);
        } else {
            addWarning($msg);
            return redirect()->back()->withInput()->withErrors();
        }
    }

}

我最终使用不同的方法,删除模型中的验证码规则,在中间件上验证它

<?php

namespace App\Http\Middleware;

use Closure;
use Sentinel;
use Input;

class VerifyCaptcha
{
    public function handle($request, Closure $next)
    {
        if ((Input::has('captcha') && Input::get('captcha') != '') && (Input::has('captchaHash') && Input::get('captchaHash') != ''))
        {
            if (rpHash(Input::get('captcha')) == Input::get('captchaHash')) {
                return $next($request);
            } else {
                return $this->errorResponse($request, 2);
            }
        } else {
            return $this->errorResponse($request, 1);
        }
    }

    public function errorResponse($request, $error) {
        switch ($error) {
            case 1:
                $msg = 'Please keyin the captcha code first';
                break;
            case 2:
                $msg = 'Wrong captcha code';
                break;
            default:
                $msg = 'Unknown error, please refresh and try again';
                break;
        }
        if ($request->ajax()) {
            return makeJSONResponse(false, $msg);
        } else {
            addWarning($msg);
            return redirect()->back()->withInput()->withErrors();
        }
    }

}

只是为了确认,您已将字段“captcha”添加到表中?不,我不希望插入captcha,因为它只是captcha只是想知道您是否应该将其从受保护的$fillable数组中删除?将其从$fillable数组中删除$rules['captcha]='required | isCaptcha';将使模型验证始终返回“captcha field is required”,如果删除$rules['captcha',则一切正常(但永远不会验证验证码)。我知道这可以在控制器上手动执行,但我正在寻找类似laravel 4.1 beforeSave()的自动方法。只是为了确认,您添加了字段“captcha”到您的表中?不,我不希望插入验证码,因为它只是验证码。我只是想知道您是否不应该将其从受保护的$fillable数组中删除?将其从$fillable数组中删除$rules['captcha]='required | isCaptcha';将使模型验证始终返回“captcha field is required”,如果删除$rules['captcha',则一切都很好(但永远不会验证captcha)。我知道这可以在控制器上手动执行,但我正在寻找一种类似于laravel 4.1 beforeSave()的自动方式
<?php

namespace App\Http\Middleware;

use Closure;
use Sentinel;
use Input;

class VerifyCaptcha
{
    public function handle($request, Closure $next)
    {
        if ((Input::has('captcha') && Input::get('captcha') != '') && (Input::has('captchaHash') && Input::get('captchaHash') != ''))
        {
            if (rpHash(Input::get('captcha')) == Input::get('captchaHash')) {
                return $next($request);
            } else {
                return $this->errorResponse($request, 2);
            }
        } else {
            return $this->errorResponse($request, 1);
        }
    }

    public function errorResponse($request, $error) {
        switch ($error) {
            case 1:
                $msg = 'Please keyin the captcha code first';
                break;
            case 2:
                $msg = 'Wrong captcha code';
                break;
            default:
                $msg = 'Unknown error, please refresh and try again';
                break;
        }
        if ($request->ajax()) {
            return makeJSONResponse(false, $msg);
        } else {
            addWarning($msg);
            return redirect()->back()->withInput()->withErrors();
        }
    }

}