2017-05-07 54 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; 

讓你得到所有宣佈IDS這裏出發是,內加入吧與目的地所有宣佈ID ...將返回這兩個用戶輸入城市所在的所有旅程的列表...

這是你正在嘗試做什麼?