【问题标题】:Laravel Eloquent WhereHas with ORDER columnLaravel Eloquent WhereHas 与 ORDER 列
【发布时间】:2020-09-16 22:22:35
【问题描述】:

我有一个 whereHas 查询,它从数据透视表中获取数据。但是在数据透视表上,我还有一个名为“订单”的额外列,我使用此列来确保项目以正确的顺序排序,因为它代表了一条公交路线。例如:巴士/渡轮停靠在 1 2 3 4 5 6。

我们有一个出发点和目的地点,表示为“port_id”。

例如,下面的查询为我提供了正确的数据,但我需要确保“订单”列始终根据出发港口 ID 和到达港口 ID 以正确的顺序排列。因此,如果您搜索 port_id 14 到 port_id 15 它不应该返回任何结果,因为“订单”列没有以这种方式连接这些结果。

这是我尝试过的:

        $routes = Route::whereHas('ports', function($query) use ($request) {
       $query->where('port_id', $request->route['from']['id']);
    })
    ->whereHas('ports', function($query) use ($request) {
        $query->where('port_id', $request->route['to']['id']);
    })->get();

这是数据透视表:

这是路由表:

谢谢。

【问题讨论】:

  • 能否分别提供表结构+样本数据+预期结果
  • @Tpojka 不,它没有,谢谢。
  • 帮助我更好地理解它。请求可能是:route_id == 3departurePort == 14destinationPort == 16 您希望得到[14, 17, 16] 的结果;这是正确的预期吗?
  • @Tpojka 查询需要检查 'order' 列是否在路由的 SEQUENCE 中。例如,一辆公共汽车从 A 点出发到 E 点,并在其间停靠 B、C 和 D。这些停靠点是按顺序排列的,与 1 2 3 4 相同。“顺序”列用于管理顺序特定旅程的停靠点。所以有人想要从 B 点到 C 点,查询还需要检查“订单”列是否是公共汽车/渡轮路线的正确顺序。

标签: mysql laravel eloquent


【解决方案1】:

我认为您可以使用 join 进行排序,然后对结果进行排序 按 route_id 然后按 'order' 列:

$routes = Route::whereHas('ports', function($query) use ($request) {
       $query->where('port_id', $request->route['from']['id']);
    })
    ->whereHas('ports', function($query) use ($request) {
        $query->where('port_id', $request->route['to']['id']);
    })
->join('route_port','route_port.route_id','=','routes.id')
->join('ports','route_port.port_id','ports.id')->orderby('route_id')
->orderby('order')->get();

如果表名有误请更正...

【讨论】:

  • 谢谢,但我需要的是仅获取端口按出发和目的地端口 ID 顺序排列的路线。因此,例如,如果我将 port_id 5 作为出发港口,将 port_id 8 作为到达港口。我只需要获取这些端口彼此处于 SEQUENCE 中的路由。谢谢
猜你喜欢
  • 2021-12-03
  • 2020-12-23
  • 2021-05-25
  • 2021-08-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-28
  • 2017-06-09
相关资源
最近更新 更多