0

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-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...
}

答えが短いほど良いです:-)。どうもありがとう!

4

2 に答える 2

0

私はそれを行う完璧な方法があるとは本当に思いません。次のいずれかを試すことができます。

1 つの if&&演算子

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

これは、1 つの条件で実行したくない 2 つの if のほとんどですが、これはワンライナーであり、短絡評価のために機能します。最初の条件がチェックされない場合、2 番目の条件はチェックされません。すでに本当です。

エラー制御演算子(非推奨)

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

これはおそらく最短で見栄えの良いソリューションですが、実際にはお勧めしません。演算子を使用すると、@重大なエラーを含むエラーが抑制され、コードの速度が低下し、後でコードをデバッグするときに予期しない問題が発生する可能性があります。

于 2013-10-19T21:44:26.010 に答える
0

ピボット テーブルの値と、ユーザーがシステム管理者アクセス権を持っているかどうかの両方をチェックするアクセサーを作成することに傾倒します。次に、ビュー内のすべてではなく、そのアクセサを使用して権限チェックを行います。

情報とビューをどのようにレイアウトしているかよくわかりません。また、コース モデルにユーザー ロジックを挿入するのはおそらく最善のアイデアではないため、アクセサーをどこにどのように正確にレイアウトするかは、私ができることではありません。自信を持って的確に提案します。しかし、それはあなたを正しい軌道に乗せるかもしれません。

于 2013-10-20T01:04:03.787 に答える