【问题标题】:Insert with postgis functions using Laravel使用 Laravel 插入 postgis 函数
【发布时间】:2017-08-12 03:21:15
【问题描述】:

我正在尝试使用 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]:未定义函数:7 错误:函数 st_geomfromtext(text) 不存在

我首先尝试使用参数来执行此操作,但遇到了同样的问题。报错说明生成了如下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, .............'))

当我复制并粘贴生成的 SQL 语句并在 pgAdmin 中运行查询时,查询执行没有问题。我曾尝试在我的应用程序中使用 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)")
    ]);

【问题讨论】:

    标签: php postgresql laravel postgis


    【解决方案1】:

    这是我的代码:

      $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
        ]
      );
    

    【讨论】:

      【解决方案2】:

      所以看来问题在于指定架构。在 PgAdmin 中,您似乎不需要指定 db 函数所属的架构即可使用 db 函数。在 Laravel 中,您必须为 db 函数指定模式。所以我的代码可以工作,但我只需要将 db 模式添加到函数中。所以这行得通:

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

      我一直认为查询默认使用公共架构,但我想在这种情况下你必须定义它。

      【讨论】:

        【解决方案3】:

        你在使用 laravel 的 postgis 扩展吗?类似THIS

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

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

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

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

        【讨论】:

        • 看起来那个包不支持 WKT,它的构建失败了,而且它的文档很糟糕。另外,如果您阅读了我的整个问题,您会发现我已经尝试过 DB::insert() 感谢您的建议
        • 同意文档不是很好。从他们的源代码来看,它确实支持 WKT。
        猜你喜欢
        • 2019-02-25
        • 2020-07-30
        • 1970-01-01
        • 1970-01-01
        • 2019-02-23
        • 2021-05-04
        • 2013-11-21
        • 2021-05-10
        • 2019-07-03
        相关资源
        最近更新 更多