2015-08-09 4 views
1

Я пытаюсь добавить капчу на все мои модели, но я имею эту ошибку:Laravel 5 Модель не вставляет заданное поле в базу данных

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`) 

Я простирающуюся пользовательский класс модель, которая будет автоматический Validate перед сохранением, здесь файл 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; 
    } 

} 

и вот модель депозита

<?php 
namespace App\Models; 

use Illuminate\Database\Eloquent\SoftDeletes; 
use DB; 

class Deposit extends BaseModel { 

    use SoftDeletes; 

    const REWARD_METHOD_1 = 1; 
    const REWARD_METHOD_2 = 2; 

    protected $dates = ['deleted_at']; 

    /** 
    * The database table used by the model. 
    * 
    * @var string 
    */ 
    protected $table = 'deposit_records'; 

    protected $fillable = array(
     'reference_number', 'deposit_amount', 'deposit_bank', 'deposit_bank_account', 'deposit_bank_holder', 'deposit_reference', 'deposit_datetime', 'deposit_receipt', 
     'bank_id', 'ban_reason', 'deposit_promotion', 'g-recaptcha-response', 'reward_method', 'captcha' 
    ); 

    public static $rules = array(
     'user_id' => 'required|exists:users,id', 
     'reference_number' => 'required|min:1', 
     'deposit_amount' => 'required|isFund', 
     'deposit_bank' => 'required|min:1', 
     'deposit_bank_account' => 'required|min:1', 
     'deposit_bank_holder' => 'required|min:1', 
     'deposit_reference' => 'min:1', 
     'deposit_datetime' => 'required|date', 
     'deposit_receipt' => 'min:1', 
     'bank_id' => 'required|exists:site_banks,id', 
     'approve_one_by' => 'exists:users,id', 
     'approve_one_at' => 'date', 
     'approve_two_by' => 'exists:users,id', 
     'approve_two_at' => 'date', 
     'ban_by' => 'exists:users,id', 
     'ban_at' => 'date', 
     'ban_reason' => 'min:1', 
     'deposit_promotion' => '', 
     'status' => 'in:0,1,2', 
     'reward_method' => 'required|in:1,2', 
     'captcha' => 'required|isRealPerson', 
    ); 

    public function user() { 
     return $this->belongsTo('App\\Models\\User', 'user_id'); 
    } 

    public function depositBank() { 
     return $this->hasOne('App\\Models\\SiteBanks', 'id', 'bank_id'); 
    } 

    public function approveOne() { 
     return $this->hasOne('App\\Models\\User', 'id', 'approve_one_by'); 
    } 

    public function approveTwo() { 
     return $this->hasOne('App\\Models\\User', 'id', 'approve_two_by'); 
    } 

    public function banBy() { 
     return $this->hasOne('App\\Models\\User', 'id', 'ban_by'); 
    } 
} 

и в моем контроллере, я звоню, как это, и он будет автоматически проверять поле и вернуть ошибку

 $deposit = new Deposit(); 

     $deposit->fill(Input::all()); 
     $deposit->deposit_bank = $sb->bank_name; 
     $deposit->deposit_bank_holder = $sb->bank_holder; 
     $deposit->deposit_bank_account = $sb->bank_account; 
     $deposit->user_id = $this->_G['user']->id; 

     if ($deposit->save()) { 
      addSuccess('Successfully submit deposit request, please wait for verification.'); 
      return makeJSONResponse(true, 'Successfully submit deposit request, please wait for verification.'); 
     } else { 
      return makeJSONResponse(false, 'Please fix the following error(s).', $deposit->errors->all()); 
     } 

, но после того, как я добавить дополнительное поле, которое не существует в базе данных, то держать ошибку на поле не найдено, но я понятия не имею, как я могу решить эту проблему, не удаляя автоматическое подтверждение, автоматическое подтверждение полезно и экономит много времени.

В Laravel 4.1, я могу сделать это как следующий

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

Просто, чтобы подтвердить, вы добавили поле «captcha» в свой стол? –

+0

нет, и я не хочу, чтобы captcha был вставлен, потому что это просто captcha – user259752

+0

Просто интересно, не следует ли вынимать его из защищенного массива $ fillable? –

ответ

0

я в конечном итоге с помощью другого метода, удалите правила капчи в модели, проверить его на промежуточного

<?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(); 
     } 
    } 

} 
Смежные вопросы