这是我第一次与Laravel和Stackoverflow合作...
我正在开发一个简单的课程管理系统。主要对象是User
和Course
,它们之间具有多对多关系。数据透视表具有附加属性,participant_role
它定义用户是该特定课程内的学生还是教师。
class Course extends Eloquent {
public function users() {
return $this->belongsToMany('User')->withPivot('participant_role')->withTimestamps();
}
}
但是,还有一个附加角色system admin,可以在User
对象上定义。这让我非常头痛。在我的刀片视图中,我具有以下内容:
@if ($course->pivot->participant_role == 'instructor') {
// do something here...
}
当已将用户分配给该特定用户$course
并且在数据透视表中有此用户-课程组合的条目时,此方法会很好地工作。
但是,问题出在系统管理员上,他也应该能够访问课程详细信息。上面的if子句给出了试图获取非对象错误的属性,显然是因为数据透视表中没有系统管理员的条目(因为角色是在User
对象中定义的)。
我可能可以通过使用一些现成的捆绑包来处理基于角色的权限来解决该问题。或者我可以(但不想)用两个内部if子句做这样的事情:
if (!empty($course->pivot)) {
if ($course->pivot->participant_role == 'instructor') {
// do something...
}
}
其他选项(建议在Stackoverflow中的部分相似条目中使用)包括1)将所有数据透视表条目读取到数组,并使用in_array检查角色是否存在,甚至2)SQL左联接在数据库级别执行此操作。
但是,最终我正在寻找一种紧凑的单线解决方案吗?我可以做类似的事情,不幸的是,这似乎行不通吗?
if (! empty ($course->pivot->participant_role == 'instructor') ) {
// do something...
}
答案越短越好:-)。非常感谢!
我真的不认为有完美的方法可以做到这一点。您可以尝试以下方法之一:
一个,如果,&&
运算符
if (!(empty($course->pivot) && $course->pivot->participant_role == 'instructor') {
// ...
}
尽管这几乎是您不想一次完成的两个ifs,但它是单线的,并且由于短路评估而起作用,如果不评估第一个条件,则不会检查第二个条件已经是真的。
错误控制运算符(不推荐)
if (@$course->pivot->participant_role == 'instructor') {
// ...
}
这可能是最短且外观更好的解决方案,但并不建议这样做。使用@
运算符可以抑制包括严重错误在内的所有错误,减慢您的代码速度,并可能在以后调试代码时带来意外的麻烦。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句