Laravel Eloquent模型ManyToMany让所有用户都有自己的角色

时间:2017-01-13 09:21:47

标签: php oop laravel-5 eloquent many-to-many

亲爱的人们。

最近,我开始更多地使用Laravel模型和雄辩的关系,而不是编写Raw查询。

现在我遇到了一个问题:

我在用户模型

中建立了关系
public function roles()
{
    return $this->belongsToMany('App\Role', 'users_has_roles', 'Users_id', 'Roles_role_id');
}

角色模型中的另一种关系:

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

我能够检索所有用户并使用控制器中的代码回显它们:

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

{&#34; ID&#34;:18,&#34;名称&#34;:&#34; Ajx6bK&#34;&#34;姓&#34;:&#34; AwkMTWzgIB&#34; &#34;用户名&#34;:&#34; vt_2528&#34;&#34; created_at&#34;:&#34; 2017年1月12日&#34;&#34;的updated_at&#34 ;:空,&#34;作用&#34;:[{&#34; ROLE_ID&#34;:3,&#34; ROLE_NAME&#34;:&#34;记者&#34;&#34; role_description&#34; :&#34;能够在系统中管理报告。&#34;,&#34; pivot&#34;:{&#34; Users_id&#34;:18,&#34; Roles_role_id&#34;:3} }]} {&#34; ID&#34;:19,&#34;名称&#34;:&#34; NJYMCU&#34;&#34;姓&#34;:&#34; ZGzjvpDAiP&#34;&# 34;用户名&#34;:&#34; vt_6443&#34;&#34; created_at&#34;:&#34; 2017年1月12日&#34;&#34;的updated_at&#34;:空,& #34;作用&#34;:[{&#34; ROLE_ID&#34;:1,&#34; ROLE_NAME&#34;:&#34;联系&#34;&#34; role_description&#34;:&# 34;拥有系统中的大部分用户权限,包括用户管理。&#34;,&#34; pivot&#34;:{&#34; Users_id&#34;:19,&#34; Roles_role_id&#34;: 1}}]} {&#34; ID&#34;:20,&#34;名称&#34;:&#34; hVUrMG&#34;&#34;姓&#34;:&#34; fc72G7Ksw2&#34;&# 34;用户名&#34;:&#34; vt_6610&#34;&#34; created_at&#34;:&#34; 2017年1月12日&#34;&#34;的updated_at&#34;:空,& #34;作用&#34;:[{&#34; ROLE_ID&#34;:2&#34; ROLE_NAME&#34;:&#34;数据输入&#34;&#34; role_description&#34 ;: &#34;能够管理系统中的记录。&#34;,&#34; pivot&#34;:{&#34; Users_id&#34;:20,&#34; Roles_role_id&#34;:2}} ]}

问题: 我无法访问表格#34;角色&#34;的任何字段变量。 $ user-&gt; roles-&gt; role_name或role_description。

3 个答案:

答案 0 :(得分:1)

$user->roles是一系列角色,因此您应该相应地访问它们:

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

答案 1 :(得分:0)

roles是对象数组,你需要循环它

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

还要了解如何设置和获取属性值:http://php.net/manual/en/sdo.sample.getset.php

答案 2 :(得分:0)

您正在对集合进行回声,因此它会将其转换为JSON 但是,如果将集合转换为数组并使用任何转储方法(dd或dump),您将看到现在可以轻松遍历该数组以访问角色。

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

这将输出此

array:4 [▼
    0 => array:8 [▶]
    1 => array:8 [▶]
    2 => array:8 [▶]
    3 => array:8 [▼
        "id" => 4
        "username" => "testcase1"
        "email" => "test1@test.com"
        "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
                ]
            ]
        ]
    ]
]

要访问角色名称和描述,您可以为此类数据的每个循环加倍

$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;