2016-04-12 24 views
1

実際には、どのテーマやコースを選択しても検索したい質問を検索したいと思います。laravel 5のbelongsToMany関係で検索しています

削除した場合はwhereHasから対象またはコースのいずれかが動作しますが、両方とも機能していません。

belongsToMany realtionshipで検索するためのより良いソリューションを提供してください。

私はQuestionモデルクラスと質問表

class Question extends Model{ 
    public function courses(){ 
     return $this->belongsToMany('App\Models\Course','course_questions'); 
    } 

    public function subjects(){ 
     return $this->belongsToMany('App\Models\Subject','subject_questions'); 
    } 
} 

を持っており、私のsearchController

public function index(Request $request){ 
     $questions = Question::with(['user','courses','branches','subjects','years','universities','question_type']) 
      ->where("status","=",1) 
      ->where(function($query) use($request){ 
       $q = $request->q; 
       if(isset($q) && !is_null($q)){ 
        $query->where("question","LIKE","%$q%"); 
       } 
      }) 
      ->whereHas('subjects',function($query) use($request){ 
       $subjects = $request->subject; 
       if(isset($subjects)){ 
        $_subjects = explode(" ",$subjects); 
        $query->whereIn("slug",$_subjects) 
        ->orWhereIn("subject_name",$_subjects); 
       } 
      }) 
      ->whereHas('courses',function($query) use($request){ 
       $course = $request->course; 
       if(isset($course)){ 
        $_course = explode(" ",$course); 
        $query->whereIn("slug",$_course) 
         ->orWhereIn("course",$_course); 
       } 
      }) 
      ->paginate(); 
     if($request->ajax()){ 
      $returnHTML = view('questions.question_list')->with('questions', $questions)->render(); 
      return response()->json(array('success' => true, 'pageContent'=>$returnHTML)); 
     } 

答えて

3

にあなたは、おそらくこのようにクエリを構築する必要があります - あなたはあなたに制約を追加する前に条件を確認する必要がありますクエリ:

$query = Question::with(['user','courses','branches','subjects','years','universities','question_type']) 
      ->where("status","=",1); 

$q = $request->q; 
if(isset($q) && !is_null($q)) { 
    $query = $query->where("question","LIKE","%$q%"); 
} 

$subjects = $request->subject; 
if (isset($subjects)) { 
    $query = $query->whereHas('subjects',function($query) use($subjects){     
     $_subjects = explode(" ",$subjects); 
     $query->whereIn("slug",$_subjects) 
     ->orWhereIn("subject_name",$_subjects);     
    }); 
} 

$course = $request->course; 
if (isset($course)) { 
    $query = $query->whereHas('courses',function($query) use($course){  
     $_course = explode(" ",$course); 
     $query->whereIn("slug",$_course) 
     ->orWhereIn("course",$_course); 
    }); 
} 

$questions = $query->paginate(); 
+0

おはよう、ありがとうございます。私はそれに多くの時間を費やしましたが、今は魔法のように働いています。 。しかし、どのように働いて、説明してください。 – Jitendra

+0

@Jeetendra説明はあまりありません。いくつかのフィルターが設定されている場合にのみ、条件に条件を追加する必要があります。コードでは、 'whereHas'を使用していくつかの条件を追加しました。ユーザがフィルタをいっぱいに入れずに結果が得られない場合でも、 –

関連する問題