laravel5.5查询生成器,其中raw不返回结果,但raw sql返回结果

qojgxg4l  于 2021-06-20  发布在  Mysql
关注(0)|答案(1)|浏览(361)

当我执行下面的作用域查询时,我没有得到任何结果,但是当我在数据库上执行结果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)'));
z9smfwbn

z9smfwbn1#

这个问题归结起来就是一个逃避现实的问题 'POINT(-79.48 43.8)' 原始db语句的一部分,由于某些原因没有在 DB::getQueryLog() .
更改自:

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

对此:

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

已解决问题并返回所需的行。
编辑:另外,对于任何想知道的人-我发现grimzy/laravelmysql空间库包含了我正在寻找的范围(以及其他许多范围)。不过,我还是学到了一些准备好的陈述。务必阅读手册。

相关问题