在Laravel 5.1中将模型保存到数据库之前执行一些操作

时间:2015-08-13 16:19:45

标签: laravel laravel-5

在Laravel 5.1模型中将数据写入数据库之前,如何修改某些数据字段或更多验证? 关于该问题的文档很难在实际应用中使用:http://laravel.com/docs/5.1/eloquent#events

我的代码是

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;
use App\Helpers\Tools as Tools;

class Atoken extends Model
{
    /**
     * The database table used by the model.
     *
     * @var string
     */
    protected $table = 'atoken';

    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $fillable = [
        'token', 
        'user_id', 
        'role',
    ];

    /**
     * The attributes excluded from the model's JSON form.
     *
     * @var array
     */
    protected $hidden = [
    ];

    public static function newToken($userId, $role){
        # Remove all token assoiciate with input user;
        Atoken::where('user_id', $userId)->delete();
        $params = [
            'user_id' => $userId,
            'role' => $role,
        ];
        Atoken::insert($params);
        $item = Atoken::where('user_id', $userId)->first();
        return $item->token;
    }

    protected static function boot(){
        static::creating(function ($model) {
            $model->token = 'sometoken';
        });
    }
}

在这种情况下,我总是遇到错误:

SQLSTATE[23502]: Not null violation: 7 ERROR:  null value in column \"token\" violates not-null constraint (SQL: insert into \"atoken\" (\"user_id\", \"role\") values (2, USER))

我该如何解决?

2 个答案:

答案 0 :(得分:8)

class Lunch extends Eloquent
{
    protected static function boot()
    {
        static::creating(function ($model) {
            $model->topping = 'Butter';

            return $model->validate();
        });
    }

    protected function validate()
    {
        // Obviously do real validation here :)
        return rand(0, 1) ? true : false;
    }

    public static function newToken($userId, $role)
    {
        static::where('user_id', $userId)->delete();

        return static::create([
            'user_id' => $userId,
            'role' => $role,
        ])->token;
    }
}

答案 1 :(得分:2)

我建议进入EventServiceProvider,并注册事件监听器

public function boot(DispatcherContract $events)
    {
        parent::boot($events);

        // Register Event Listeners
        \App\Product::updating(function ($product) {
            $product->onUpdating();
        });
...

然后在模型中创建函数onUpdating。您也可以选择saving, saved, creating, created, updating, updated..

此文档包含更多内容: https://laravel.com/docs/5.1/eloquent#events