2016-04-12 6 views
1

Eigentlich möchte ich jene Frage suchen, die Benutzer suchen nach einem beliebigen Thema oder Kurs auswählen.suche in der angleToMany-Beziehung in Laravel 5

wenn ein Entfernen entweder whereHas von Thema oder natürlich seine funktioniert, aber mit seinen beiden nicht funktioniert.

Bitte geben Sie eine bessere Lösung für die Suche in gehört zu vielen Beziehungen.

Ich habe eine Frage Tabelle mit Question Modellklasse

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'); 
    } 
} 

und in meinem 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)); 
     } 

Antwort

3

Sie sollten Ihre Abfrage wahrscheinlich auf diese Weise bauen - Sie sollten die Bedingungen überprüfen, bevor Sie Einschränkungen mit denen Sie Ihre Abfrage:

$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

Hey, Danke. Ich habe viel Zeit darauf verbracht, aber jetzt funktioniert es auf magische Weise. . Aber wie funktioniert es, bitte erklären. – Jitendra

+0

@Jeetendra Es gibt nicht viel zu erklären. Sie müssen nur dann Bedingungen zu Ihrer Abfrage hinzufügen, wenn Sie einige Filter festgelegt haben. Im Code haben Sie einige Bedingungen mit 'whereHas' hinzugefügt, die Sie immer hinzufügen, selbst wenn keine Filter vom Benutzer gefüllt wurden und das Ergebnis nicht erwartet wurde –