返回点类型 PSQL 和 DOCTRINE

Posted

技术标签:

【中文标题】返回点类型 PSQL 和 DOCTRINE【英文标题】:Return Point type PSQL and DOCTRINE 【发布时间】:2021-10-14 13:16:51 【问题描述】:

我有一个使用 POSTGIS 点值的应用程序。我将它作为坐标存储在我的位置表中。我可以使用 Symfony 和教义设置一个新的指向数据库的点。问题是相反的,当我试图在 symfony 上获得 te 点时,我无法显示一个空白值或 null。我得到了下一个配置文件:

Point.php

<?php

namespace App\DBAL\Types\Geolocation;

class Point

    private $latitude;
    private $longitude;

    /**
     * Point constructor.
     */
    public function __construct($latitude, $longitude)
    
        $this->latitude = $latitude;
        $this->longitude = $longitude;
    

    /**
     * @return mixed
     */
    public function getLongitude()
    
        return $this->longitude;
    

    /**
     * @return mixed
     */
    public function getLatitude()
    
        return $this->latitude;
    

PointType.php

<?php

namespace App\DBAL\Types\PSQL;

use App\DBAL\Types\Geolocation\Point;
use Doctrine\DBAL\Platforms\AbstractPlatform;
use Doctrine\DBAL\Types\Type;

class PointType extends Type


    const POINT = 'point';

    /**
     * @param array $column
     * @param AbstractPlatform $platform
     * @return string
     */
    public function getSQLDeclaration(array $column, AbstractPlatform $platform)
    
        return "POINT";
    

    /**
     * @return string
     */
    public function getName()
    
        return self::POINT;
    

    /**
     * @param mixed $value
     * @param AbstractPlatform $platform
     * @return Point
     */
    public function convertToPHPValue($value, AbstractPlatform $platform)
    
        list($longitude, $latitude) = sscanf($value, 'POINT(%f %f)');
        return new Point($latitude, $longitude);
    

    /**
     * @param mixed $value
     * @param AbstractPlatform $platform
     * @return string
     */
    public function convertToDatabaseValue($value, AbstractPlatform $platform)
    
        return $value->getLongitude() . ',' . $value->getLatitude();
    

    /**
     * @param string $sqlExpr
     * @param AbstractPlatform $platform
     * @return string
     */
    public function convertToDatabaseValueSQL($sqlExpr, AbstractPlatform $platform)
    
        return sprintf('PointFromText(%s)', $sqlExpr);
    

doctrine.yaml:

doctrine:
    types:
        point: App\DBAL\Types\PSQL\PointType

在我的位置文件中,我得到了属性坐标,如下所示:

 /**
 * @ORM\Column(type="point")
 */
private $coordinate;

public function getCoordinate(): Point

    return $this->coordinate;


public function setCoordinate($coordinate): self

    $this->coordinate = $coordinate;

    return $this;

在我调用 getCoordinate 函数和 getLatitude 之后,它们返回空值。我不知道如何使用它,我尝试了在 *** 上找到的各种方法,但任何人都对我有用。

【问题讨论】:

【参考方案1】:

已解决 - 问题出在 PointType 类上。我在数据库中看到了原始数据,它的形式是“(值,值)”。只有我需要更改的是 convertToPHPValue 方法。

之前:

list($longitude, $latitude) = sscanf($value, 'POINT(%f %f)');

之后:

list($longitude, $latitude) = sscanf($value, '(%f, %f)');

【讨论】:

以上是关于返回点类型 PSQL 和 DOCTRINE的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法在单个 psql 查询中返回总计数和行数?

psql如何传各种变量

Postgres.app 设置:获取 `which psql` 以返回所需路径

centos8下postgreSQL入门1.2之psql与server版本不一致问题解决

psql:致命:数据库“<用户>”不存在

将 PSQL 表达式转换为 Laravel Eloquent Builder 表达式