Laravel Eloquent multiple whereHas on relationship where column 'order' 高于前一个 whereHas

Posted

技术标签:

【中文标题】Laravel Eloquent multiple whereHas on relationship where column \'order\' 高于前一个 whereHas【英文标题】:Laravel Eloquent multiple whereHas on relationship where column 'order' is higher than the previous whereHasLaravel Eloquent multiple whereHas on relationship where column 'order' 高于前一个 whereHas 【发布时间】:2021-12-03 17:36:07 【问题描述】:

我正在开发一个在特定位置停靠的公交路线系统。 路线停靠点按“顺序”列按升序排列,如 1、2、3、4、5.. 等。

这些是我的桌子:

巴士

id | operator_id | name 
1  | 1           | The Big Red Bus

地点(一些虚拟数据只是举例)

id | name       | slug        | parent_id
1  | Amsterdam  | amsterdam   | 
2  | London     | london      |
3  | Stockholm  | stockholm   |
4  | Helsinki   | helsinki    |
5  | Dam Square | dam-square  | 1

路线

id | name 
1  | Amsterdam - London 
2  | London - Amsterdam

ROUTE_LOCATIONS(位置)

id | route_id | place_id | order | start | end
1  | 1        | 1        | 1     | 1     | 0
2  | 1        | 2        | 2     | 0     | 0
3  | 1        | 3        | 3     | 0     | 0
4  | 1        | 4        | 4     | 0     | 1

用户输入 当我开始搜索以检查我们是否有任何可用的公交路线时,给定的用户输入是 PLACES 表中的一个地方 slug。 例如:

来自:伦敦 至:水坝广场

以下是我迄今为止尝试过的查询,但我真的不确定如何在实际查询中构建检查/连接以检查“订单”序列是否升序。我就是想不通。

    $buses = Bus::whereHas('route.locations.place', function ($query) use ($from, $to) 
        $query->where('slug', $from)->where('end', 0);
    )->whereHas('route.locations.place', function ($query) use ($from, $to) 
        $query->where('slug', $to)->where('start', 0);
    )->get();

关系结构如下:

BUS hasOne ROUTE

ROUTE belongsToMany BUS

ROUTE hasMany LOCATIONS (ROUTE_LOCATIONS TABLE)

我已经尝试了以下查询来获取可用路线,但我真的很喜欢直接在 laravel eloquent 中使用我的模型进行操作,因此我可以轻松地使用我视图中的关系。我只是不确定如何去做。

以下查询仅适用于地点 ID 而不是 slug,我真的很喜欢它是 slug 而不是 ID。

$routes = DB::select('SELECT R.id, R.name
FROM route_locations L
INNER JOIN routes R ON R.id = L.route_id
WHERE
L.place_id = "'.$from->id.'" AND
EXISTS (SELECT id FROM route_locations F WHERE L.route_id = F.route_id AND F.order > L.order AND F.place_id = "'.$to->id.'")');

有谁知道这是否可行以及如何实现?

谢谢!

【问题讨论】:

【参考方案1】:

你的代码可以改写成这个:

$busses = Bus::whereHas('route.locations.place', function ($query) use ($from, $to) 
    $query->where('slug', $from)
        ->where('slug', $to)
        ->where('start', 0)
        ->where('end', 0);
        // here should do a check if the 'order' column is higher than the first wherehas
)->get();

这对我来说没有多大意义。

【讨论】:

但我如何才能真正检查“订单”列是否更高? 显示你的表的表结构,我不知道你想做什么以及order column.在哪里 我更新了原始问题,详细说明了我想要实现的目标。 还是不清楚,比如slug是什么,不只显示一个表。 我已经添加了表结构信息,希望现在更有意义?

以上是关于Laravel Eloquent multiple whereHas on relationship where column 'order' 高于前一个 whereHas的主要内容,如果未能解决你的问题,请参考以下文章

php Laravel 5 Eloquent CheatSheet #laravel #eloquent

php Laravel 5 Eloquent CheatSheet #laravel #eloquent

php Laravel 5 Eloquent CheatSheet #laravel #eloquent

php [Eloquent CheatSheet] Eloquent #laravel #eloquent的常见查询方法

Laravel - Eloquent 连接

Laravel 从 Raw DB 到 Eloquent