Eloquent ORM 交叉搜索
Eloquent ORM cross search
我正在构建一个小型搜索引擎来获取世界各地的多个旅程,这是我的旅程 table 的样子:
如你所见,departure_checkpoint和arrival_checkpoint是连在一起的,这是一个完整的旅程,所有这些目的地都属于同一个announce_id数字2。我现在想做什么它是创建一个表单,您可以在其中插入出发点和到达点,搜索引擎将 return 包含这些目的地的 announce_id。获取像巴黎到伦敦或维也纳到多伦多这样的并排位置很简单,但是如何进行交叉搜索以获取像巴黎 - 维也纳或巴黎 - 多伦多这样的旅程? (穿越目的地)。
我正在使用 Eloquent 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,它会成为子查询吗?
这是您可以使用的(不是最好的)解决方案之一:
程序:
- 查找具有给定出发检查点的旅程
- 查找具有给定到达检查站和给定 announce_ids 从出发查找结果的旅程
- 检查founded department ID是否小于或等于founded arrival ID(否则反向出发和到达仍然有效)
$出发='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);
嗯...早上喝咖啡和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 进行内部连接...将 return 这两个用户输入的城市所在的所有旅程的列表...
这就是你想要做的吗?
我正在构建一个小型搜索引擎来获取世界各地的多个旅程,这是我的旅程 table 的样子:
如你所见,departure_checkpoint和arrival_checkpoint是连在一起的,这是一个完整的旅程,所有这些目的地都属于同一个announce_id数字2。我现在想做什么它是创建一个表单,您可以在其中插入出发点和到达点,搜索引擎将 return 包含这些目的地的 announce_id。获取像巴黎到伦敦或维也纳到多伦多这样的并排位置很简单,但是如何进行交叉搜索以获取像巴黎 - 维也纳或巴黎 - 多伦多这样的旅程? (穿越目的地)。
我正在使用 Eloquent 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,它会成为子查询吗?
这是您可以使用的(不是最好的)解决方案之一:
程序:
- 查找具有给定出发检查点的旅程
- 查找具有给定到达检查站和给定 announce_ids 从出发查找结果的旅程
- 检查founded department ID是否小于或等于founded arrival ID(否则反向出发和到达仍然有效)
$出发='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);
嗯...早上喝咖啡和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 进行内部连接...将 return 这两个用户输入的城市所在的所有旅程的列表...
这就是你想要做的吗?