gpt4 book ai didi

php - Laravel 5.5 Query Builder whereRaw 不返回结果但原始 SQL 返回结果

转载 作者:行者123 更新时间:2023-11-29 07:29:45 25 4
gpt4 key购买 nike

当我执行下面的范围查询时,我没有得到任何结果,但是当我在数据库上执行生成的 SQL(带有转录的绑定(bind))时,我得到了预期的结果。我可以在没有范围的情况下查询模型,结果符合预期。

这是检查一个点是否存在于多边形中的简单查询。我看不到任何错误或异常的迹象。我不知所措。我错过了什么吗?

区域类(带查询范围):

namespace App;

use Illuminate\Database\Eloquent\Model;
use Grimzy\LaravelMysqlSpatial\Eloquent\SpatialTrait;
use Grimzy\LaravelMysqlSpatial\Types\Point;
use Grimzy\LaravelMysqlSpatial\Types\Polygon;
use Grimzy\LaravelMysqlSpatial\Types\Linestring;

class Area extends Model
{
use SpatialTrait;

protected $table = "areas";

protected $spatialFields = [
'point', // MySQL POINT type
'area' // MySQL POLYGON type
];

public function scopeContainsPoint($query, $lat, $lng) {
return $query->whereRaw("ST_Contains(area, GeomFromText('POINT(? ?)'))", [$lng, $lat]);
}

}

查询范围使用和结果:

$s = Area::containsPoint(43.80, -79.48)->get();

=> Illuminate\Database\Eloquent\Collection {#3192
all: [],
}

Eloquent 查询日志:

DB::getQueryLog();
=> [
[
"query" => "select * from `areas` where ST_Contains(area, GeomFromText('POINT(? ?)'))",
"bindings" => [
-79.48,
43.8,
],
"time" => 311.05,
],
]

Resuting SQL(返回正确的结果):

select * from `areas` where ST_Contains(area, GeomFromText('POINT(-79.48 43.8)'));

最佳答案

问题归结为转义原始 DB 语句的 'POINT(-79.48 43.8)' 部分的问题,由于某种原因没有在 DB::getQueryLog().

改变自:

$query->whereRaw("ST_Contains(area, GeomFromText('POINT(? ?)'))", [$lng, $lat]);

为此:

$query->whereRaw("ST_Contains(area, GeomFromText(?))", ["POINT($lng $lat)"]);

解决了问题并返回了预期的行。

编辑:另外,对于任何想知道的人 - 我发现 Grimzy/laravel-mysql-spatial library 包含我正在寻找的范围(以及许多其他范围)。尽管如此,仍然学到了一些关于准备好的陈述的知识。请务必阅读手册。

关于php - Laravel 5.5 Query Builder whereRaw 不返回结果但原始 SQL 返回结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51995623/

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