使用 Laravel 使用 postgis 函数插​​入

Insert with postgis functions using Laravel

我正在尝试使用 postgis 扩展将几何图形插入到我的 postgresql 数据中。更具体地说,我想插入一个 WKT 线串。这就是我所做的:

$sql = "INSERT INTO myschema.trail (\"name\", \"description\", \"user_id\", \"location_id\", \"source_file\", \"geom\") 
        VALUES ('".
            $p['name']."', '".
            $p['description']."', ".
            \Auth::user()->user_id.", ".
            $p['location_id'].", '".
            'uploads/myfile'.",
            ST_GeomFromText('$wkt'::text))";
\DB::insert($sql);

当我这样做时,出现错误:

SQLSTATE[42883]: Undefined function: 7 ERROR: function st_geomfromtext(text) does not exist

我最初尝试使用参数来执行此操作,但遇到了同样的问题。报错说明生成了下面的SQL:

INSERT INTO myschema.trail ("name", "description", "user_id", "location_id", "source_file", "geom")
VALUES ('Test', 'Test', 1, 1, 'uploads/myfile', ST_GeomFromText('LINESTRING(-114.0653326549 49.2872680351, .............'))

当我在 pgAdmin 中复制并粘贴生成的 SQL 语句和 运行 查询时,查询执行没有问题。我曾尝试在我的应用程序中使用 postgres 用户,以防这是一个权限问题,但这没有帮助。

如果我删除查询的 postgis 部分,它 运行 在我的应用程序中没问题。无论出于何种原因,我的 Laravel 应用程序无法使用 postgis 功能,但 pgAdmin 可以。

有没有人以前注意到过这个问题,或者有什么想法可以解决这个问题?谢谢

编辑

我刚刚也试了下面的方法,我得到了同样的错误:

Trail::create([
        'name' => 'test',
        'description' => 'test',
        'user_id' => 1,
        'location' => 1,
        'source_file' => 'uploads/myfile',
        'geom' => \DB::raw("ST_GeomFromText('$wkt'::text)")
    ]);

您是否在使用 laravel 的 postgis 扩展?像 THIS.

默认情况下,如果您没有为 postgis 添加扩展,laravel 会尝试查看 ST_GeomFromText 是否是基础数据库函数。 这将有助于非常轻松地处理具有几何形状的对象。 希望对您有所帮助。

或者尝试 运行 RAW SQL。 像这样:

DB::insert('QUERY...');

确保适当地转义查询参数。

看来问题出在指定架构上。在 PgAdmin 中,您似乎不需要指定 db 函数所属的架构即可使用 db 函数。在 Laravel 中,您必须为数据库函数指定架构。所以我的代码有效,但我只需要将数据库模式添加到函数中。所以这有效:

Trail::create([
    'name' => 'test',
    'description' => 'test',
    'user_id' => 1,
    'location' => 1,
    'source_file' => 'uploads/myfile',
    'geom' => \DB::raw("public.ST_GeomFromText('$wkt'::text)")
]);

我一直认为查询默认为 public 模式,但我想在这种情况下您必须定义它。

这是我的代码:

  $last_id = DB::table('table.geom')->insertGetId(
    [
      'geom' => \DB::raw("ST_GeomFromText('$data->geom',4326)"),
      'id_layer' => $data->id_layer,
      'object_type' => $data->object_type
    ]
  );