使用 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
]
);
我正在尝试使用 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
]
);