Laravel Eloquent WhereHas 搭配 ORDER 列排序

3
我有一个 whereHas 查询,从一个 pivot 表中获取数据。但是在这个 pivot 表中还有一个额外的列叫做“order”,我使用这一列来确保项目按正确的顺序排序,因为它代表公交路线。例如:公交/渡轮停靠在 1 2 3 4 5 6 站。
我们有一个出发点和目的地点,它们分别表示为“port_id”。
所以举个例子,下面的查询会给我正确的数据,但我需要确保“order”列总是根据出发港口 ID 和到达港口 ID 的正确顺序排列。因此,如果您搜索从港口 ID 14 到港口 ID 15,则不应返回任何结果,因为“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']);
    })->get();

这是数据透视表: enter image description here 这是路由表: enter image description here 谢谢。

@Tpojka 不,谢谢。 - Adriaan
帮我更好地理解它。请求可能是:route_id == 3departurePort == 14destinationPort == 16,您希望得到结果为[14, 17, 16];这个预期是否正确? - Tpojka
@Tpojka 查询需要检查“order”列是否按照路线顺序排列。例如,一辆公交车从A点出发到E点,在途中停靠B、C和D。这些停靠点是按照顺序排列的,就像1 2 3 4一样。 “order”列用于管理特定旅程的停靠顺序。因此,如果有人想从B点到C点,查询还需要检查“order”列是否正确地按照公交车/渡轮路线排序。 - Adriaan
@Tpojka 基本上需要检查出发港口ID的“order”列是否低于目的地港口ID的“order”列,并且目的地港口ID当然需要高于出发港口的“order”列。 - Adriaan
@Tpojka 我其实可以得到想要的结果,但我不想用PHP做额外的循环,我只想用一个MySQL查询完成所有操作。 - Adriaan
显示剩余7条评论
1个回答

1
我认为你可以使用联接进行排序,然后按路线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顺序相连的路线。例如,如果我的出发港口ID为5,到达港口ID为8。我只需要获取这些港口顺序相连的路线。谢谢。 - Adriaan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接