Laravel 5.5查询生成器,其中Raw未返回任何结果,但原始SQL会返回

时间:2018-08-23 23:35:55

标签: php mysql laravel eloquent

当我在下面执行范围查询时,没有任何结果,但是在数据库上执行生成的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,
     ],
   ]

正在恢复SQL(返回正确的结果):

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

1 个答案:

答案 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库包含我正在寻找的范围(以及其他许多范围)。虽然仍然学到一些有关准备好的语句的知识。务必阅读手册。