2017-12-21 25 views
0

어제 (Laravel Eloquent query build select min value) 질문을 여기에 왔습니다. 그로부터 방을 선택하기 위해 쿼리를 업데이트하고 있습니다.Laravel Ellquent 일대 다 관계, 동적으로 관련 테이블에 쿼리 추가

내 이전 쿼리

$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); 

내 업데이트 uqery :

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

내가 한 가지 문제에 달렸다. 는 사용자가

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

어떻게 난 내 업데이트 쿼리에이를 추가 할 수 있습니다 만 난 다음 쿼리를 포함하고 다음의 설비를 선택하면?

대신이의
$query->whereIn('amenities_id', $amenities); 

당신은 사용해야합니다 :

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

을 당신이 때문에

$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(); 

답변

0

내가 문제가 여기에 생각이 방법하지만 행운을 시도 하위 쿼리를 사용하여 amenities을 참조하면이 id를 참조해야합니다. id 열.

+0

은'amenities_room' 테이블'room_id' 등을 포함'amenities_id' 열 –

+0

그러나 수를 당신이 얻을 하시겠습니까? 'withCount'에서 당신은'amentities'에서 작동하고'amentities_room'에서 작동하지 않습니다. 어쩌면 당신은'$ query-> whereIn ('amenities_id', $ amenities);'withCount'의 바깥 쪽을 옮기고 싶습니까? –

+0

글자 그대로 쿼리가 어떻게되는지 알지 못해서 배우고 돌아 오게. –

0

제 생각에는 'whereHas'빌더 기능을 찾고 있습니다. 임 데 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

시도해 볼 수 있습니다 DB :: enableQueryLog(); // laravvel query exec dd (DB :: getQueryLog()); 을 사용하여 해당 빌더에 대해 sql이 실행 중인지 확인하십시오. – aK0nshin