0
votes

Dear people.

Recently I started to work more with Laravel models and eloquent relations instead of writing Raw queries.

Now I faced a problem:

I got relation in User model:

public function roles()
{
    return $this->belongsToMany('App\Role', 'users_has_roles', 'Users_id', 'Roles_role_id');
}

And another relation in Role model:

    public function users()
{
    return $this->belongsToMany('App\User', 'users_has_roles', 'Roles_role_id', 'Users_id');
}

I am able to retrieve all users and echo them by using code in controller:

$users = User::with('roles')->get();
foreach ($users as $user) {
echo $user."<br>";
}

{"id":18,"name":"Ajx6bK","surname":"AwkMTWzgIB","username":"vt_2528","created_at":"2017-01-12","updated_at":null,"roles":[{"role_id":3,"role_name":"Reporter","role_description":"Is able to manage reports in system.","pivot":{"Users_id":18,"Roles_role_id":3}}]} {"id":19,"name":"NJYMCU","surname":"ZGzjvpDAiP","username":"vt_6443","created_at":"2017-01-12","updated_at":null,"roles":[{"role_id":1,"role_name":"Admin","role_description":"Has most of user rights in the system, including users managment.","pivot":{"Users_id":19,"Roles_role_id":1}}]} {"id":20,"name":"hVUrMG","surname":"fc72G7Ksw2","username":"vt_6610","created_at":"2017-01-12","updated_at":null,"roles":[{"role_id":2,"role_name":"Data-entry","role_description":"Is able to manage records in system.","pivot":{"Users_id":20,"Roles_role_id":2}}]}

Problem: I can't access any of fields variables of table "roles". $user->roles->role_name or role_description.

3

3 Answers

1
votes

$user->roles is an array of roles, so you should access them accordingly:

foreach ($user->roles as $role) {
    echo $role->role_name;
}
0
votes

roles are array of objects, you need to loop it

foreach($user->roles as $role){
   echo $role->role_name."<br/>";
}

Also learn how Setting and Getting Property Values : http://php.net/manual/en/sdo.sample.getset.php

0
votes

You are doing echo on a collection so it will convert it into JSON.
But if you convert your collection to array and use any dump methods (dd or dump) you will see that it easy now to loop through that array to access roles.

$users = User::with('roles')->get();
dd($users->toArray());

This will output this

array:4 [▼
    0 => array:8 [▶]
    1 => array:8 [▶]
    2 => array:8 [▶]
    3 => array:8 [▼
        "id" => 4
        "username" => "testcase1"
        "email" => "[email protected]"
        "firstname" => "Test"
        "lastname" => "One"
        "created_at" => "2018-04-04 05:17:13"
        "updated_at" => "2018-04-04 05:17:13"
        "roles" => array:1 [▼
            0 => array:5 [▼
                "id" => 4
                "name" => "user"
                "created_at" => "2018-04-04 05:17:13"
                "updated_at" => "2018-04-04 05:17:13"
                "pivot" => array:2 [▼
                    "user_id" => 4
                    "role_id" => 4
                ]
            ]
        ]
    ]
]

And to access the role names and descriptions you can double for-each loop that array like this

$users = User::with('roles')->get();
foreach ($users->toArray() as $key => $value) {
    foreach ($value['roles'] as $innerkey => $innervalue) {
        echo $innervalue['role_id'];//for role id
        echo $innervalue['role_name'];//for role name
        echo $innervalue['role_description'];//for role description
    }
}
exit;