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-clause により、Trying to get property of non-objectエラーが発生します。これは、明らかにシステム管理者のピボット テーブルにエントリがないためです (ロールはUser
オブジェクト内で定義されているため)。
ロールベースのアクセス許可を処理するために既製のバンドルを使用することで、おそらく問題を解決できます。または、2 つの内部 if 句を使用して次のようなことを行うこともできます (ただし、したくありません)。
if (!empty($course->pivot)) {
if ($course->pivot->participant_role == 'instructor') {
// do something...
}
}
他のオプション (Stackoverflow の部分的に類似したエントリで提案されています) には、1) ピボット テーブル エントリをすべて配列に読み込み、in_array を使用してロールが存在するかどうかを確認する、または 2) データベース レベルでこれを行うために SQL left join が含まれます。
しかし、最終的にはコンパクトな 1 行のソリューションを探していますか? これに似たようなことはできますか?残念ながらうまくいきませんか?
if (! empty ($course->pivot->participant_role == 'instructor') ) {
// do something...
}
答えが短いほど良いです:-)。どうもありがとう!