2017-12-21 5 views
0

Ich habe eine Frage hier gestern (Laravel Eloquent query build select min value) gestellt. Von diesem aktualisiere ich meine Abfrage, um Räume auszuwählen.Laravel Eloquente eine zu viele Beziehung, dynamische Abfrage der verwandten Tabelle hinzufügen

Meine vorherige Abfrage:

$buildquery=Room:: 

     with(['hotel' => function ($query) { 
      $query->where('status', 0); 
     }]) 

     ->with('image')->with('amenities'); 

     if ($request->filled('location_id')) { 

      $buildquery->Where('city', $request->location_id); 
      //print_r($request->location_id); 
     } 

     // If amenities is there add it to query 
     if($request->filled('amenities')){ 
      $amenities = $request->amenities; 
      $count = count($amenities); 

      $buildquery->withCount(['amenities' => function($query) use ($amenities){ 
          $query->whereIn('amenities_id', $amenities); 
         }]) 
         ->having('amenities_count', $count); 
     } 


     // If price is there add it to query 
     if ($request->filled('min_price')) { 
      $buildquery->whereBetween('price', [$request->min_price, $request->max_price]);  
     } 

     $buildquery->Where('astatus', 1)->Where('status', 0); 

     //$buildquery->orderBy('price', 'DESC')->take(1); 

     $rooms = $buildquery->simplePaginate(20); 

Meine aktualisiert uqery:

$rooms = Hotel::with(['room' => function($query) { 
      $query->orderBy('price', 'asc')->first(); 
     }, 
     'room.image', 
     'room.amenities']) 
     ->get(); 

ich in ein Problem lief. Wenn der Benutzer die Annehmlichkeiten, dann nur ich die folgende Abfrage am einschließlich

if($request->filled('amenities')){ 
       $amenities = $request->amenities; 
       $count = count($amenities); 

       $buildquery->withCount(['amenities' => function($query) use ($amenities){ 
           $query->whereIn('amenities_id', $amenities); 
          }]) 
          ->having('amenities_count', $count); 
      } 

Wie kann ich dies meiner aktualisiert Abfrage hinzufügen?,

versucht auf diese Weise, aber kein Glück

$rooms = Hotel::with(['room' => function($query) { 
      $query->orderBy('price', 'asc')->first(); 
     }, 
     'room.image', 
     'room.amenities' => function($query) { 
      $query->withCount(['amenities' => function($query) use ($amenities){ 
          $query->whereIn('amenities_id', $amenities); 
         }]) 
         ->having('amenities_count', $count); 
     }])->get(); 

Antwort

0

denke ich, ist das Problem hier:

$query->whereIn('amenities_id', $amenities); 

Statt dessen sollten Sie verwenden:

$query->whereIn('amenities.id', $amenities); 

weil Sie mit Unterabfrage, wo Sie haben amenities, so dass sie ID verweisen Sie sollten nur verwenden id Spalte.

+0

Im mit 'amenities_room' Tabelle enthält' 'room_id' und amenities_id' Spalten –

+0

Aber welche Zählung möchten Sie bekommen? In 'withCount' arbeiten Sie mit' amenities' und nicht mit 'amentities_room'. Vielleicht möchtest du '$ query-> whereIn ('adessants_id', $ advances)' 'außerhalb von' withCount' dann verschieben? –

+0

buchstäblich ich weiß nicht, was los ist mit Abfrage, lassen Sie mich lernen und wieder kommen –

0

Ich denke, Sie suchen nach 'WhereHas' Builder-Funktion. https://laravel.com/docs/5.5/eloquent-relationships#querying-relationship-existence

$rooms = Hotel::with(['room' => function($query) { 
      $query->orderBy('price', 'asc')->first(); 
     }, 
     'room.image', 
    }]) 
    ->whereHas('amenities', function ($query) use ($amenities) { 
     $query->whereIn('id', $amenities); 
    }) 
    ->get(); 
+0

können Sie versuchen DB :: enableQueryLog(); // Laravvel Abfrage exec dd (DB :: getQueryLog()); , um genau zu erhalten, was SQL für diesen Builder ausgeführt wird. – aK0nshin

Verwandte Themen