2017-05-07 1 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와 함께 ... 두 개의 사용자가 입력 한 도시가있는 모든 여행 목록을 반환합니다 ...

이 작업을 수행하려고하십니까?