Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Do something before saving model to database in Laravel 5.1

How can I do something such as modify some data fields or more validate before writing data to database in Laravel 5.1 model ? It's document about that problem is hard to use in real application: http://laravel.com/docs/5.1/eloquent#events

My code is

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

In this case, I always got error:

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

How can I fix it?

like image 576
Son Tran Avatar asked Aug 13 '15 16:08

Son Tran


People also ask

What is difference between create and save in Laravel?

What is difference between create and save in Laravel? Save can be used to both create a new Record and update a existing record . Whereas create is used to create a new record by providing all required field at one time .

What is first () in Laravel?

The first() method will return only one record, while the get() method will return an array of records that you can loop over. Also, the find() method can be used with an array of primary keys, which will return a collection of matching records.

What does get () do in Laravel?

This allows you to add conditions throughout your code until you actually want to fetch them, and then you would call the get() function.

What is fillable in Laravel model?

The fillable property is used inside the model. It takes care of defining which fields are to be considered when the user will insert or update data. Only the fields marked as fillable are used in the mass assignment. This is done to avoid mass assignment data attacks when the user sends data from the HTTP request.


2 Answers

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;
    }
}
like image 139
Joseph Silber Avatar answered Oct 19 '22 22:10

Joseph Silber


I would recommend to go into EventServiceProvider, and register event listeners

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

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

then create function onUpdating within the model. You also can choose from saving, saved, creating, created, updating, updated..

This documentation has more: https://laravel.com/docs/5.1/eloquent#events

like image 24
Yevgeniy Afanasyev Avatar answered Oct 19 '22 20:10

Yevgeniy Afanasyev