Laravel:查询后传递数据以通过路径查看

时间:2018-04-26 05:10:39

标签: laravel

我最近问了一个关于定义多对多关系的问题(使用belongsToMany),这是一个巨大的帮助。所以现在在我的模特中我有:

用户模型

 public function subjects()
 {
     return $this->belongsToMany('App\Subject', 'users_subjects', 'user_id', 'subjects_id');
 }

主题模型

  public function users()
  {
      return $this->belongsToMany('App\User', 'users_subjects', 'subject_id', 'user_id');
  }

这样我就可以通过users表在subjectsusers_subjects之间建立关系。我的下一步是创建一个控制器,SubjectsController,最终看起来像这样:

class SubjectsController extends Controller
{
  // returns the view where subjects will be displayed
  public function index()
  {
    return view('profiles.professor.prof_didactic_subjects');
  }

  // get users with subjects
  public function getSubjects()
  {
    $subjects = User::with('subjects')->get();
  }

  // get a single user with a subject
  public function getSubject($id)
  {
    $materia = User::where('id', '=', $id)->with('subjects')->first();
  }

}

我不太确定控制器中的代码。

最后一步是让我变得棘手,即使在阅读文档之后:我想将每个结果传递给视图,因此我可以有多个图块,每个图块都填充了与用户关联的主题的数据: / p>

@foreach ($subjects as $subject)
      <div class="tile is-parent">
        <article class="tile is-child box">
          <p class="title">{{ $subject['name'] }}</p>
          <div class="content">
            <p>{{ $subject['description'] }}</p>
          </div>
        </article>
      </div> 
@endforeach

我尝试了许多不同的路由配置,但不断获取未定义的变量错误或尝试访问非对象错误。

这里有什么正确的行动方案?我觉得我错过了一些非常基本的东西。提前感谢您的帮助。

答案

@ Sohel0415提供的解决方案完美无缺。控制器上的index()方法现在看起来像这样:

  public function index()
  {
    // temporary value while I figure out how to get the id of the current user
    $user_id = 6; 

    $subjects = Subject::whereHas('users', function($q) use ($user_id){
      $q->where('user_id', $user_id);
    })->get();
    return view('profiles.professor.prof_didactic_subjects')->with('subjects', $subjects);
  }

我的路线如下:

Route::get('/professor', 'SubjectsController@index');

我很丢失,所以这绝对救了我,再次感谢:)

1 个答案:

答案 0 :(得分:2)

您需要将$subjects传递给view。你可以使用compact()方法 -

public function index()
{
    $subjects = Subject::with('users')->get();
    return view('profiles.professor.prof_didactic_subjects', compact('subjects'));
}

或使用{ - 1}}方法,如 -

with()

如果您希望获得特定public function index() { $subjects = Subject::with('users')->get(); return view('profiles.professor.prof_didactic_subjects')->with('subjects', $subjects); } 的{​​{1}},请使用Subject -

user_id