2017-03-13 14 views
0

私は取得しようとしているクエリがあります。その旅行や場所の詳細と一緒にリスト情報を取得すると仮定します。LaravelのleftJoinクエリに参加

これは、イムは、先のコントローラ内のクエリを呼び出す方法です:

public function destinations($id) { 

     $destination = Destination::findOrFail($id); 

     $listingGuides = Listing::findGuidesTrips($destination) 
      ->with('locations') 
      ->withCount('trips') 
      ->get(); 

     return view('destinations.index', compact('listingGuides'); 

} 

そしてfindGuidesTrips方法が掲載モデルの内側にある:

public static function findGuidesTrips($destination) { 

     $query = self::query() 
      ->leftJoin('trips', 'listing_id', '=', 'listings.id') 
      ->addSelect(
       \DB::raw('listings.name,listings.slug,listings.type,listings.id,MIN(trips.cost) as starting_price') 
      ) 
      ->groupBy('listings.id'); 

     $query = self::query() 
      ->leftJoin('locations', 'listing_id', '=', 'listings.id') 
      ->addSelect(
       \DB::raw('locations.longitude as longitude') 
      )->addSelect(
       \DB::raw('locations.latitude as latitude') 
      ); 

     $query = $query->whereHas('locations',function($query) use ($destination) { 
      $query->where('region', 'like', $destination->location)->orWhere('country', $destination->location); 

     }); 

     return $query; 
    } 

これは私が戻って得るものです:

enter image description here

私は2 $ query = self :: query()quiresを持っていますが、1つしか呼び出されていません(下のもの)。それはトップのself :: queryを無視します。

私は、これらの2つのleftJoinクエリを1つにまとめる方法を考えていましたか?または、このクエリを実行するより良い方法はありますか?

(私はこれをやってみました:)

$query = self::query() 
      ->leftJoin('trips', 'listing_id', '=', 'listings.id') 
      ->addSelect(
       \DB::raw('listings.name,listings.slug,listings.type,listings.id,MIN(trips.cost) as starting_price') 
      ) 
      ->leftJoin('locations', 'listing_id', '=', 'listings.id') 
      ->addSelect(
       \DB::raw('locations.longitude as longitude') 
      )->addSelect(
       \DB::raw('locations.latitude as latitude') 
      )->groupBy('listings.id'); 

しかし@Timルイスと@Nikleshで述べたように、それは私にIntegrity constraint violation: 1052 Column 'listing_id' in on clause is ambiguousエラー

+1

、ちょうどあなたが 'にテーブル名を指定することができることに注意してください - '、> leftJoin( '旅行' - 'のような> leftJoin()'関数、 '、' = '、' listing.id ') 'または' - > leftJoin(' locations '、' locations.listing_id '、' = '、listing.id');それはあなたのあいまいさの問題を取り除くでしょう。 –

+1

最後のクエリの 'listing_id'の代わりに' trips.listing_id'を最初に、 'locations.listing_id'を2番目に試してみてください。 – C2486

+0

@TimLewis素敵な仕事の男、それについて考えなかった。はい、私が欲しいものを正確に返します!ありがとうございました。 – David

答えて

0

を与え、私がしなければならなかったすべてだった:

trips.listing_id最初のクエリの場合はlocations.listing_id、ここで

は、最終的なクエリです:一見

public static function findGuidesTrips($destination) { 

     $query = self::query() 
      ->leftJoin('trips', 'trips.listing_id', '=', 'listings.id') 
      ->addSelect(
       \DB::raw('listings.name,listings.slug,listings.type,listings.id,MIN(trips.cost) as starting_price') 
      ) 
      ->leftJoin('locations', 'locations.listing_id', '=', 'listings.id') 
      ->addSelect(
       \DB::raw('locations.longitude as longitude') 
      )->addSelect(
       \DB::raw('locations.latitude as latitude') 
      )->groupBy('listings.id'); 

     $query = $query->whereHas('locations',function($query) use ($destination) { 
      $query->where('region', 'like', $destination->location)->orWhere('country', $destination->location); 

     }); 

     return $query; 
    }