雄辩的ORM交叉搜索

时间:2017-05-07 11:35:19

标签: sql laravel orm eloquent search-engine

我正在构建一个小型搜索引擎来获取世界各地的多个旅程,以下是我的Journeys表的样子:

Journeys Table

正如您所看到的,departure_checkpoint和arrival_checkpoint是链接的,它是一个完整的旅程,所有这些目的地都属于同一个announce_id号码2.我现在要做的是创建一个表格,你在哪里插入您的出发和到达点,搜索引擎将返回包含这些目的地的announce_id。从Paris到伦敦或维也纳到多伦多的并排位置很简单,但是如何进行交叉搜索以获取像巴黎 - 维也纳或巴黎 - 多伦多这样的旅程? (穿越目的地)。

我正在使用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,它是否会成为子查询?

1 个答案:

答案 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 ...将返回这两个用户所在城市的所有旅程的列表...

这是你想要做的吗?