如何在Laravel Eloquent中使用变量作为属性名称

3
有没有办法在Eloquent中使用变量?
例如:
public function showLessons($skill)
    {
        $user = (\App\User::where('id', Auth::user()->getId())->first());
        $type = $user->type;
        if ($type === "student") {
            $bs = ($user->student_bronze_ . $skill);
            $ss = ($user->student_silver_ . $skill);
            $gs = ($user->student_gold_ . $skill);
        } elseif ($type === "school") {
            $bs = ($user->school_bronze_ . $skill);
            $ss = ($user->school_silver_ . $skill);
            $gs = ($user->school_gold_ . $skill);
        };
        return view('pages.lessons', compact("bs", "ss", "gs"));
    }

我正在尝试检查用户的级别是否与课程的id相同或更高。
1个回答

3
我认为你的主要问题是:在Laravel Eloquent模型中,能否使用变量作为属性名。
答案是可以的,你需要用大括号{}将其包裹起来。
$user->{$type.'_'.$medal.'_'.$skill};

如果您将一些代码移动到用户模型中,那么您的控制器会变得更加整洁。
// User.php
public function skill($medal, $skill) {
    $type = $this->type;    
    return $this->{$type.'_'.$medal.'_'.$skill};
}

那么您的控制器将更加简洁:

public function showLessons($skill)
{
    $user = Auth::user();
    
    $bs = $user->skill('bronze', $skill);
    $ss = $user->skill('silver', $skill);
    $gs = $user->skill('gold', $skill);
    
    return view('pages.lessons', compact("bs", "ss", "gs"));
}

其实我只是对我的答案进行了一次复查。代码仍然可以优化一下,看看更新的版本 :) - wschopohl

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接