与2个数据透视表数据搜索的多对多关系

时间:2017-02-12 13:47:29

标签: php laravel laravel-5.2 many-to-many

Skills
-------
id  name
1   PHP
2   Laravel

Qualifications
-----------------
id  name
1   MBA
2   Graduate
3   Post Graduate

students
------------
id  name
1   John
2   Smith

 2 pivot tables

student_skills

student_id  skill_id
1           1
1           2
2           1

student_qualifications

tutor_id    qualification_id
1           2
1           2
2           2

在前端,用户可以根据我们显示数据所需的选项选择多个资格(复选框)和技能(复选框)。

例如:如何让具有毕业证书和MBA技能的学生以及Laravel和PHP技能

1 个答案:

答案 0 :(得分:1)

以下是一个关于如何做到这一点的示例(由于您的问题中缺少详细信息,它可能不准确,但它应该给您一个想法)

(我认为你最好使用Mutli-select框而不是复选框来获得技能和资格)

假设您想按技能搜索学生&合格 而且你的模型中有正确的关系方法

  //Don't forget to import Students model at top of the controller
public function whatever(Request $request)
    {
    $data = Student::with('qualifications', 'skills');

     // assuming that the form will pass an array of skills names
     //if the form passes an array of ID's of skills it becomes easier

    if (!empty($request->skills)) {
        foreach ($request->skills as $skill) {
            $data->whereHas('skills', function ($query) use ($skill) {
                $query->where('id', $skill);
            })->get();
        }
    }

       // same goes for qualifications
    if (!empty($request->qualifications)) {
        foreach ($request->qualifications as $qualification) {
            $data->whereHas('qualifications', function ($query) use ($skill) {
                $query->where('id', $qualification);
            })->get();
        }
    }

    // execute the query now
   $data->get(); // or pagniate(10)
}

如果您传递的是ID'而不是名称

   if (!empty($request->skills)) {
            $data->whereHas('skills', function ($query) use ($skills)                   {
                $query->whereIn('id', $skills);
            })->get();
    }

同样适用于资格。

我希望你明白这一点,你可以排序和填充,这可能不是你需要的确切的东西,但如果你得到它会帮助你很多。