我目前正在开发一个项目,我有用户,角色和他们的 Profiles .

用户模型只有电子邮件和密码字段,角色模型有名称和描述字段 . 它们在数据透视表上具有belongsToMany关系 .

我在单独的模型类上有3个不同的配置文件,这些配置文件与具有hasOne关系的用户模型相关联 . 我正在尝试根据用户的角色为用户分配配置文件模型,因为每个角色都有不同的用途和不同的字段 .

public function getUserProfile($roleName)
{
    switch($roleName) {
        case 'callcenter':
            $this->profile = $this->adminProfile();
            break;
        case 'manager':
            $this->profile = $this->adminProfile();
            break;
        case 'admin':
            $this->profile = $this->adminProfile();
            break;
        case 'student':
            $this->profile = $this->studentProfile();
            break;
        case 'staff':
            $this->profile = $this->staffProfile();
            break;
    }
}

上面的函数在下面的每个循环中调用

public function profile()
{
    foreach($this->roles as $role){

        $this->getUserProfile($role->name);

    }

    return $this->profile;
}

profile方法返回hasOne关系对象,并根据switch case匹配分配profile属性 .

如果我使用配置文件查询单个用户,它会返回配置文件,但是当我使用配置文件查询所有用户并通过if语句循环它们以获取角色匹配的配置文件时,配置文件返回null,尽管它们在数据库中并且附加到用户 .

$users = User::with('profile')->get();

$staff = [];

foreach($users as $user)
{
    if('staff' == $user->getUserRole()->name){
        $staff[] = $user;
    }
}

return $staff;

Callcenter,manager和admin角色返回正确的配置文件,但员工和学生配置文件返回null . 我试图理解这种行为背后的原因 . 我很感激任何解释,以帮助我做到这一点 .