Laravel 自定义 SQL 查询参数绑定-经纬度

1,133次阅读
没有评论

引言
laravel使用模型进行数据库操作时,并不是所有的字段或者关联关系 都能满足查询需求,有时候会有一些MySQL的函数计算等功能放在数据库 层面执行。

本文说一说自定义的参数绑定办法。

学习时间
假如有一个需求,已知经纬度手动计算两点之间的近距离。我们会使用类似下面的计算公式:

3959 * acos( cos( radians( ? ) ) * cos( radians( lat ) ) * cos( radians( lng ) – radians(?) ) + sin( radians( ? ) ) * sin( radians( lat ) ) )
其中问号位置就是我们需要填入的变量数据,也就是一个经纬度坐标,根据参照点,计算出数据库内每条记录内的该点距离参照点的距离。 那么如果写到程序里,应该如何把绑定参数按顺序传入呢。

既然是自定义的字段名,我们可以使用 DB::raw 方式传入。代码如下:

$property =
Property::select(
DB::raw(“title, lat, lng, (
3959 * acos(
cos( radians( ? ) ) *
cos( radians( lat ) ) *
cos( radians( lng ) – radians(?) ) +
sin( radians( ? ) ) *
sin( radians( lat ) )
)
) AS distance”)
)
->having(“distance”, “<“, “?”) ->orderBy(“distance”)
->take(20)
->setBindings([$lat, $lng, $lat, $radius])
->get();
这个查询语句有些复杂,可是有章可循。首先是使用select方法指定了返回字段名, 对于自定义的字段 distance 使用 having 子句进行进一步条件限定。 最重要就是 setBindings 方法了,传送的是前面自定义SQL语句的位置参数。只需一一对应上就可以了。

如果大家经常使用laravel的调试功能的话,应该会注意到,这种问号的写法是laravel本身封装SQL语句用的。 而对于写惯了PDO原生SQL语句查询的,则可以使用PDO方式的绑定方式:

$property = Property::select(DB::raw(“title, lat, lng, ( 3959 * acos( cos( radians(:lat) ) * cos( radians( lat ) ) * cos( radians( lng ) – radians(:lng) + sin(radians(:lat_i) ) * sin( radians( lat ) ) ) ) AS distance”), [“lat” => $lat, “lng” => $lng, “lat_i” => $lat]);
上面的语句只用了select方法,其他的筛选和排序,与上一节代码相同,不需要调用 setBindings 方法。

为了方便查看,我们也可以不画蛇添足地使用 DB::raw 方法。而直接使用 selectRaw ,更为简洁直观:

$select = <<<SQL
title,
lat,
lng,
(3959acos(cos(radians( ? ))cos(radians(lat))cos(radians(lng)-radians( ? ))+sin(radians( ? ))sin(radians(lat)))) AS distance
SQL;
首先拼装好SQL语句的字段,然后使用laravel模型的方法:

$property = Property::selectRaw($select, [$lat, $lng, $lat])->having(‘distance’, ‘<‘, $radius)->orderBy(‘distance’)->take(20)->get();
写在最后
本文通过三种方式实现了laravel模型进行复杂的自定义查询, 其中提供了两种参数绑定的方式,我们推荐使用 selectRaw 的方式, 更为直观。

Happy coding :-)

正文完
可以使用微信扫码关注公众号(ID:xzluomor)
post-qrcode
 0
评论(没有评论)

文心AIGC

2024 年 11 月
 123
45678910
11121314151617
18192021222324
252627282930  
文心AIGC
文心AIGC
人工智能ChatGPT,AIGC指利用人工智能技术来生成内容,其中包括文字、语音、代码、图像、视频、机器人动作等等。被认为是继PGC、UGC之后的新型内容创作方式。AIGC作为元宇宙的新方向,近几年迭代速度呈现指数级爆发,谷歌、Meta、百度等平台型巨头持续布局
文章搜索
热门文章
清库存!DeepSeek突然补全R1技术报告,训练路径首次详细公开

清库存!DeepSeek突然补全R1技术报告,训练路径首次详细公开

清库存!DeepSeek突然补全R1技术报告,训练路径首次详细公开 Jay 2026-01-08 20:18:...
训具身模型遇到的很多问题,在数据采集时就已经注定了丨鹿明联席CTO丁琰分享

训具身模型遇到的很多问题,在数据采集时就已经注定了丨鹿明联席CTO丁琰分享

训具身模型遇到的很多问题,在数据采集时就已经注定了丨鹿明联席CTO丁琰分享 衡宇 2026-01-08 20:...
「北京版幻方」冷不丁开源SOTA代码大模型!一张3090就能跑,40B参数掀翻Opus-4.5和GPT-5.2

「北京版幻方」冷不丁开源SOTA代码大模型!一张3090就能跑,40B参数掀翻Opus-4.5和GPT-5.2

「北京版幻方」冷不丁开源SOTA代码大模型!一张3090就能跑,40B参数掀翻Opus-4.5和GPT-5.2...
AI金矿上打盹的小红书,刚刚醒了一「点点」

AI金矿上打盹的小红书,刚刚醒了一「点点」

AI金矿上打盹的小红书,刚刚醒了一「点点」 鱼羊 2025-12-26 17:04:08 来源:量子位 一个积...
最新评论
ufabet ufabet มีเกมให้เลือกเล่นมากมาย: เกมเดิมพันหลากหลาย ครบทุกค่ายดัง
tornado crypto mixer tornado crypto mixer Discover the power of privacy with TornadoCash! Learn how this decentralized mixer ensures your transactions remain confidential.
ดูบอลสด ดูบอลสด Very well presented. Every quote was awesome and thanks for sharing the content. Keep sharing and keep motivating others.
ดูบอลสด ดูบอลสด Pretty! This has been a really wonderful post. Many thanks for providing these details.
ดูบอลสด ดูบอลสด Pretty! This has been a really wonderful post. Many thanks for providing these details.
ดูบอลสด ดูบอลสด Hi there to all, for the reason that I am genuinely keen of reading this website’s post to be updated on a regular basis. It carries pleasant stuff.
Obrazy Sztuka Nowoczesna Obrazy Sztuka Nowoczesna Thank you for this wonderful contribution to the topic. Your ability to explain complex ideas simply is admirable.
ufabet ufabet Hi there to all, for the reason that I am genuinely keen of reading this website’s post to be updated on a regular basis. It carries pleasant stuff.
ufabet ufabet You’re so awesome! I don’t believe I have read a single thing like that before. So great to find someone with some original thoughts on this topic. Really.. thank you for starting this up. This website is something that is needed on the internet, someone with a little originality!
ufabet ufabet Very well presented. Every quote was awesome and thanks for sharing the content. Keep sharing and keep motivating others.
热评文章
海信CES发布全新一代RGB-Mini LED,全球首创玲珑4芯真彩背光

海信CES发布全新一代RGB-Mini LED,全球首创玲珑4芯真彩背光

海信CES发布全新一代RGB-Mini LED,全球首创玲珑4芯真彩背光 量子位的朋友们 2026-01-06...
英特尔CES奇袭老黄大本营!英伟达显卡刚涨价,最强酷睿量产出货

英特尔CES奇袭老黄大本营!英伟达显卡刚涨价,最强酷睿量产出货

英特尔CES奇袭老黄大本营!英伟达显卡刚涨价,最强酷睿量产出货 十三 2026-01-06 13:54:54 ...
陈天桥代季峰打响2026大模型第一枪:30B参数跑出1T性能

陈天桥代季峰打响2026大模型第一枪:30B参数跑出1T性能

陈天桥代季峰打响2026大模型第一枪:30B参数跑出1T性能 鹭羽 2026-01-06 14:28:58 来...
OpenAI推理第一人离职,7年打造了o3/o1/GPT-4/Codex

OpenAI推理第一人离职,7年打造了o3/o1/GPT-4/Codex

OpenAI推理第一人离职,7年打造了o3/o1/GPT-4/Codex 衡宇 2026-01-06 13:0...