当我在下面执行范围查询时,没有任何结果,但是在数据库上执行生成的SQL(带有绑定的转录)时,却得到了预期的结果。我可以在没有范围的情况下查询模型,并且结果符合预期。
这是一个简单的查询,用于检查多边形中是否存在点。我没有看到任何错误或异常的迹象。我很茫然。我想念什么吗?
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: [],
}
DB::getQueryLog();
=> [
[
"query" => "select * from `areas` where ST_Contains(area, GeomFromText('POINT(? ?)'))",
"bindings" => [
-79.48,
43.8,
],
"time" => 311.05,
],
]
select * from `areas` where ST_Contains(area, GeomFromText('POINT(-79.48 43.8)'));
答案 0 :(得分:1)
该问题归结为一个问题,该问题使原始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库包含我正在寻找的范围(以及其他许多范围)。虽然仍然学到一些有关准备好的语句的知识。务必阅读手册。