2017-05-07 10 views
3

私はここに、世界中の複数の旅をフェッチするために小さな検索エンジンを構築する私の旅の表には、どのように見えるかですよ:あなたが見ることができるように雄弁ORM横断検索

Journeys Table

は、departure_checkpointとarrival_checkpointがありますそれは完全な旅であり、そのすべての目的地は同じannounce_id番号2に属しています。ここでは出発点と到着地点を挿入するフォームを作成し、検索エンジンはそれらの目的地を含むannounce_idを返します。パリのような横並びの場所をロンドンやウィーンにトロントにフェッチするのは簡単ですが、パリ - ウィーンやパリ - トロントのような旅を取るためにクロスサーチを行うにはどうすればいいですか? (目的地を越えて)。

私は雄弁ORMを使用していますが、これは私がこれまで持っているものです。

public function search(Request $request) { 

    if ($request->isMethod('post')) { 

     $departure = $request->get('departure'); 
     $arrival = $request->get('arrival'); 

     $announceIds = DB::table('journeys') 
      ->select(DB::raw('announce_id')) 
      ->where('departure_checkpoint', $departure) 
      ->where('arrival_checkpoint', $arrival) 
      ->get(); 

     foreach($announceIds as $value) { 

      $this->founds = DB::table('announcesForDelivery') 
       ->select(DB::raw('*')) 
       ->where('announce_id', $value->announce_id) 
       ->get(); 
     } 

     return response()->json($this->founds); 
    } 

    return false; 
} 

この作品だけサイドバイサイドではなく、横断検索のために。私はannounce_idを使って旅をフェッチしなければならないと思うが、Eloquent ORMを使ってそれを行う方法がわからない、サブクエリになるだろうか?ここで

答えて

1

あなたが使用することができます(ない最高の)解決策の一つである:

手順:

  • が与えられた出発チェックポイント
  • との旅は、与えられた到着チェックポイントと出発から与えられたannounce_idsで旅を探します結果を見つけよう
  • 出発出発IDが設立到着ID以下であることを確認します(そうでなければ、到着時の逆行出発は引き続き有効です)

$ departure = 'Paris';

$departure = 'Paris'; 
$arrival = 'Vienne'; 

// First pick journeys with given departure 
$journeysWithDeparture = DB::table('journeys') 
    ->where('departure_checkpoint', $departure) 
    ->get(); 

// Then pick only journeys which has given arrival 
$journeysWithArrival = DB::table('journeys') 
    ->whereIn('announce_id', $journeysWithDeparture->pluck('announce_id')->toArray()) 
    ->where('arrival_checkpoint', $arrival) 
    ->get(); 


$foundedAnnounceIds = []; 
$processedAnnounceIds = []; 

// Pick only journeys where departureId <= arrivalId 
foreach ($journeysWithArrival as $journey) 
{ 
    if(in_array($journey->announce_id, $processedAnnounceIds)) 
    { 
     continue; 
    } 

    $departure = $journeysWithDeparture->whereStrict('announce_id', $journey->announce_id)->first(); 

    if (isset($departure) && $journey->id >= $departure->id) 
    { 
     $foundedAnnounceIds[] = $journey->announce_id; 
    } 

    $processedAnnounceIds[] = $journey->announce_id; 
} 

dd($foundedAnnounceIds); 
+0

あなたの答えをありがとう、それは私がそれを試み、あなたに知らせるトリックを行うことができるように見えます。 –

+0

私はあなたの答えを検証しました、それは今の魅力のように働いています!ありがとうございました。 –

0

うーん...朝のコーヒーとSQL ...笑そのようなことについてはどのように

:出発がどこにある

select id_a from 
    (select announce_id id_a from Journeys where departure_checkpoint = 'paris') a 
inner join 
    (select announce_id id_b from Journeys where arrival_checkpoint = 'london') b 
on a.id_a = b.id_b; 

ですから、すべてのIDをアナウンスますが、内部には、それに参加します目的地のすべての告知IDで...これらの2つのユーザー入力都市があるすべての旅のリストを返します。

これはあなたがやろうとしていることですか?