<?php

use App\Permission;
use App\Role;
use Illuminate\Database\Seeder;

class PermissionsTableSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        //get first three roles
        $roles = Role::orderBy('id', 'asc')->take(1)->get();

        $permissions = [
            ['name' => 'view.roles',    'display_name' => 'View Roles',    'description'  => 'View the Role',    'group_key' => 'Roles'],
            ['name' => 'create.roles',  'display_name' => 'Create Roles',   'description' => 'Create the Role',  'group_key' => 'Create Roles'],
            ['name' => 'edit.roles',    'display_name' => 'Edit Roles',     'description' => 'Edit the Role',    'group_key' => 'Edit Roles'],
            ['name' => 'delete.roles',  'display_name' => 'Delete Roles',   'description' => 'Delete the Role',  'group_key' => 'Delete Roles'],

            ['name' => 'view.users',    'display_name' => 'View Users',     'description' => 'View the Users',    'group_key' => 'Users'],
            ['name' => 'create.users',  'display_name' => 'Create Users',   'description' => 'Create User',       'group_key' => 'Create Users'],
            ['name' => 'edit.users',    'display_name' => 'Edit Users',     'description' => 'Edit User',          'group_key' => 'Edit Roles'],
            ['name' => 'delete.users',  'display_name' => 'Delete Users',    'description' => 'Delete roles',      'group_key' => 'Delete Roles'],

        ];

        //create all permissions
        foreach ($permissions as $permission)
        {
            Permission::create($permission);
        }

        //get all permissions
        $permi = Permission::pluck('id')->toArray();

        //assign all permissions to three roles.
        foreach($roles as $role) {
            $role->permissions()->attach($permi);

<?php

use App\Role;
use App\User;
use Illuminate\Database\Seeder;

class AssignRoleSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        $user = User::findOrFail(1)->first();
        $role = Role::findOrFail(1)->first();

        return $user->roles()->attach($role);
    }
}



<?php

use App\Role;
use Illuminate\Database\Seeder;

class RolesTableSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        //Roles

        $roles = [

            [
                'name' => 'admin',
                'display_name' => 'Admin',
                'description'  =>  'Adminstrator',

            ],

            [
                'name' => 'author',
                'display_name' => 'Author',
                'description'  =>  'Author',
            ],

            [
                'name' => 'manager',
                'display_name' => 'Manager',
                'description'  =>  'Manager',
            ],

        ];

        foreach ($roles as $role){
            Role::create($role);
        }
    }
}


<?php


use App\RoleUser;
use Illuminate\Database\Seeder;

class RoleUserTableSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        RoleUser::create([
            'user_id' => 1,
            'role_id' =>1,
        ]);
    }
}


<?php

use App\User;
use Illuminate\Database\Seeder;

class UsersTableSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        //Create User
        User::create([
            'name' => 'Ben',
            'email'=>'admin:gmail.com',
            'password'=> bcrypt('password'),
            'status' => '1',
        ]);
    }
}



<?php

use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreateRolesTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {

        Schema::create('roles', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->string('name');
            $table->string('display_name');
            $table->string('description')->nullable();
            $table->softDeletes();
            $table->timestamps();
        });

        Schema::create('permissions', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->string('name');
            $table->string('display_name');
            $table->string('description')->nullable();
            $table->string('group_key')->nullable();
            $table->softDeletes();
            $table->timestamps();
        });

        /**
         * This table will hold permission for particular role
         */
        Schema::create('permission_role', function (Blueprint $table) {
            $table->bigInteger('permission_id')->unsigned();
            $table->bigInteger('role_id')->unsigned();
            $table->foreign('permission_id')
                ->references('id')
                ->on('permissions')
                ->onDelete('cascade');
            $table->foreign('role_id')
                ->references('id')
                ->on('roles')
                ->onDelete('cascade');
            $table->primary(['permission_Id', 'role_id']);
        });

        /**
         * This table will hold the roles for users and role id
         * you can assign more than one role for each user now
         */
        Schema::create('role_user', function (Blueprint $table) {
            $table->bigInteger('role_id')->unsigned();
            $table->bigInteger('user_id')->unsigned()->nullable();
            $table->foreign('role_id')
                ->references('id')
                ->on('roles')
                ->onDelete('cascade');
            $table->foreign('user_id')
                ->references('id')
                ->on('users')
                ->onDelete('cascade');
            $table->primary(['role_id', 'user_id']);
        });

    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('permission_role');
        Schema::dropIfExists('role_user');
        Schema::dropIfExists('permissions');
        Schema::dropIfExists('roles');
    }
}




class Permission extends Model
{
    protected  $table = 'permissions';


    public  $fillable =['name','display_name','description','group_key'];

    public function roles()
    {
        return $this->belongsToMany(Role::class);
    }
}



<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class PermissionRole extends Model
{
    protected  $table  = 'permission_role';

    public $timestamps = false;

    protected  $fillable = [
        'permission_id',
        'role_id',
    ];


}


<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Role extends Model
{

    public  $fillable =['name','display_name','description'];

    public  function  permissions()
    {
        return $this->hasMany(Permission::class);
    }


    public  function  users()
    {
        return $this->belongsToMany(User::class);
    }


    public function  Role_Users()
    {
        return $this->belongsToMany(Role_user::class);
    }



}



<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class RoleUser extends Model
{
        protected  $table = 'role_user';

        public $timestamps = false;


        protected  $fillable = [

            'user_id',
            'role_id'
        ];


        public  function  user()
        {
            return $this->belongsToMany(User::class);
        }

        public  function  role()
        {
            return $this->belongsTo(Role::class);
        }


}



<?php

namespace App;

use Illuminate\Notifications\Notifiable;
use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Foundation\Auth\User as Authenticatable;

class User extends Authenticatable
{
    use Notifiable;

    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $fillable = [
        'name', 'email', 'password',
    ];

    /**
     * The attributes that should be hidden for arrays.
     *
     * @var array
     */
    protected $hidden = [
        'password', 'remember_token',
    ];

    /**
     * The attributes that should be cast to native types.
     *
     * @var array
     */
    protected $casts = [
        'email_verified_at' => 'datetime',
    ];


    public function  Role_user()
    {
        return $this->hasOne(Role_user::class);
    }
}



        }
    }
}