Laravel 4:Check in many-to-many relationship属性,即使它不存在

时间:2013-10-19 15:34:33

标签: php laravel

这是我第一次使用Laravel和Stackoverflow ......

我正在开发一个简单的课程管理系统。主要对象是UserCourse,它们之间具有多对多关系。数据透视表还有一个附加属性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对象中定义的)。

我可以通过使用一些现成的bundle来处理基于角色的权限来解决问题。或者我可以(但不想)用两个内部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...
}

答案越短越好:-)。非常感谢!

2 个答案:

答案 0 :(得分:0)

我真的不认为这是一种完美的方式。你可以试试其中一个:

一个if &&运算符

if (!(empty($course->pivot) && $course->pivot->participant_role == 'instructor') {
    // ...
}

虽然这几乎是你不想在一个中做的两个ifs,但它是一个单行并且因为短路评估而起作用,其中如果第一个条件不会检查第二个条件不是真的。

错误控制操作员(不推荐)

if (@$course->pivot->participant_role == 'instructor') {
    // ...
}

这可能是最短且更好看的解决方案,但并不是真正推荐的。使用@运算符可以抑制任何错误(包括关键错误),从而减慢代码速度,并在以后调试代码时带来意外麻烦。

答案 1 :(得分:0)

我倾向于创建一个accessor来检查数据透视表值,以及用户是否具有系统管理员访问权限。然后使用该访问者进行权限检查,而不是视图中的全部内容。

我不确定你是如何布置你的信息和视图的,并且将用户逻辑注入你的课程模型可能不是最好的主意,所以你在哪里以及如何布置访问者不是我可以自信地提出一些明确的建议。但它可能会让你走上正轨。