gpt4 book ai didi

mysql - 如何在 laravel 5 中对关系列使用 'having' 和分页

转载 作者:可可西里 更新时间:2023-11-01 06:37:06 25 4
gpt4 key购买 nike

我需要抓取关系“经销商”的距离 < 200 的车辆

Vehicle::join('dealers', 'vehicles.dealer_id', '=', 'dealers.id')
->select(DB::raw("dealers.id, ( cos( radians(latitude) ) * cos( radians( longitude ) ) ) AS distance"))
->havingRaw('distance < 200');

我正在尝试在关系 (belongsTo) 经销商的别名“距离”上使用 havingRaw。但因错误而失败:

Column not found: 1054 Unknown column 'distance' in 'having clause'

更新

当我像这样将分页功能添加到上述查询时,问题实际上发生了。

$vehicle = Vehicle::join('dealers', 'vehicles.dealer_id', '=', 'dealers.id')
->select(DB::raw("dealers.id, ( cos( radians(latitude) ) * cos( radians( longitude ) ) ) AS distance"))
->havingRaw('distance < 200');

$result = $vehicle->paginate(15);

最佳答案

更新

如果您在查询中使用 paginate(),laravel 将尝试执行以下 SQL 代码来计算可能匹配的总数:

select count(*) as aggregate 
from `vehicles` inner join `dealers`
on `vehicles`.`dealer_id` = `dealers`.`id`
having distance < 200

如您所见,此查询中没有这样的列或别名 distance

我原来的答案中的选项 2 也可以解决该问题。

原始答案

这似乎是一个 MySQL 严格模式问题。如果你使用 laravel 5.3,默认情况下会启用严格模式。您有两个选择:

选项 1:在 config/database.php 中禁用 MySQL 的严格模式

...
'mysql' => [
...
'strict' => false,
...
],
...

选项 2:使用 WHERE 条件

Vehicle::join('dealers', 'vehicles.dealer_id', '=', 'dealers.id')
->select(DB::raw("dealers.id, ( cos( radians(latitude) ) * cos( radians( longitude ) ) ) AS distance"))
->whereRaw('cos( radians(latitude) ) * cos( radians( longitude ) ) < 200');

文档:

A MySQL extension to standard SQL permits references in the HAVINGclause to aliased expressions in the select list. EnablingONLY_FULL_GROUP_BY disables this extension, thus requiring the HAVINGclause to be written using unaliased expressions.

Server SQL Modes - ONLY_FULL_GROUP_BY

关于mysql - 如何在 laravel 5 中对关系列使用 'having' 和分页,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40194120/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com