Search code examples
phparrayslaraveleloquent

How to get permission name value from array eloquent laravel


I'm sorry if my english a bit weird, please ask me if you don't understand about my question. So, I want a logic like this. When I tried with simple array like below, it works.

    $a = array('car', 'bicycle', 'plane');
    $b = array('car', 'boat', 'truck');
    foreach ($a as $c)
    {
        if (in_array($c,$b))
        {
            echo "<b>" . $c . "</b>";
            echo "\r\n";
        } else
        {
            echo $c;
            echo "\r\n";
        }
    }

But when I try to apply it in an array laravel eloqeunt it looks like I can't get the value from the array. I want to matching the array (permission name) from the database. I would like to show all permission name from 'permission' table then if 'permission name' that already apllied to a 'role' I want it display as checked. Here's my code :

    $roles = Role::where('id', '=', 2)->with(['permissions'])->get();
    $permissions = Permission::all();
    foreach ($roles as $role)
    {
        foreach ($permissions as $permission)
        {
            $roleper = array($role['permissions']);
            $pername = array($permissions);
            if (in_array($pername,$roleper))
            {
                echo "<b>" . $permission['name'] . "</b>";
                echo "\r\n";
            } else {
                echo $permission['name'];
                echo "\r\n";
            }

        }
    }

When I return the $roleper here's the result :

[[{"id":1,"name":"Add Color","guard_name":"web","created_at":"2020-08-10 02:49:25","updated_at":"2020-08-10 02:49:25","pivot":{"role_id":2,"permission_id":1}},{"id":2,"name":"Edit Color","guard_name":"web","created_at":"2020-08-10 02:50:49","updated_at":"2020-08-10 02:50:49","pivot":{"role_id":2,"permission_id":2}},{"id":3,"name":"Delete Color","guard_name":"web","created_at":"2020-08-10 02:50:57","updated_at":"2020-08-10 02:50:57","pivot":{"role_id":2,"permission_id":3}}]]

When I return the $pername here's the result :

[[{"id":1,"name":"Add Color","guard_name":"web","created_at":"2020-08-10 02:49:25","updated_at":"2020-08-10 02:49:25"},{"id":2,"name":"Edit Color","guard_name":"web","created_at":"2020-08-10 02:50:49","updated_at":"2020-08-10 02:50:49"},{"id":3,"name":"Delete Color","guard_name":"web","created_at":"2020-08-10 02:50:57","updated_at":"2020-08-10 02:50:57"},{"id":4,"name":"Add Material","guard_name":"web","created_at":"2020-08-10 03:11:16","updated_at":"2020-08-10 03:11:16"},{"id":5,"name":"Edit Material","guard_name":"web","created_at":"2020-08-10 03:11:25","updated_at":"2020-08-10 03:11:25"},{"id":6,"name":"Delete Material","guard_name":"web","created_at":"2020-08-10 03:11:36","updated_at":"2020-08-10 03:11:36"},{"id":7,"name":"Add Brand","guard_name":"web","created_at":"2020-08-10 03:11:48","updated_at":"2020-08-10 03:11:48"},{"id":8,"name":"Edit Brand","guard_name":"web","created_at":"2020-08-10 03:11:54","updated_at":"2020-08-10 03:11:54"},{"id":9,"name":"Delete Brand","guard_name":"web","created_at":"2020-08-10 03:12:00","updated_at":"2020-08-10 03:12:00"},{"id":10,"name":"Add Product","guard_name":"web","created_at":"2020-08-10 03:12:09","updated_at":"2020-08-10 03:12:09"},{"id":11,"name":"Edit Product","guard_name":"web","created_at":"2020-08-10 03:12:17","updated_at":"2020-08-10 03:12:17"},{"id":12,"name":"Delete Product","guard_name":"web","created_at":"2020-08-10 03:12:23","updated_at":"2020-08-10 03:12:23"}]]

Solution

  • You can use builtin methods array_intersect, array_diff to get common and different elements between 2 arrays

    $permissions = Permission::all()->pluck('name')->toArray();
    foreach ($roles as $role)
    {
        $rolePermissions = $role['permissions']->pluck('name')->toArray();
        $maches = array_intersect($permissions, $rolePermissions);
        $differences = array_diff($permissions, $rolePermissions);
        //... loop $matches and $differences
    }