2017-05-07 45 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 ...将返回这两个用户输入城市所在的所有旅程的列表...

这是你正在尝试做什么?