在 Doctrine2 中配置原生 Point PostgreSQL 类型

Als*_*ian 3 postgresql doctrine symfony doctrine-orm

尝试使用 Postgres 执行与此处相同的操作:

http://codeutopia.net/blog/2011/02/19/using-spatial-data-in-doctrine-2/

我对“convertToDatabaseValue”函数有问题(请参阅此处:http : //doctrine-dbal.readthedocs.org/en/latest/reference/types.html#custom-mapping-types

我的自定义类型:

use Doctrine\DBAL\Types\Type;
use Doctrine\DBAL\Platforms\AbstractPlatform;

class PointType extends Type
{
const POINT = 'point';

public function getSqlDeclaration(array $fieldDeclaration, AbstractPlatform $platform)
{
    return 'POINT';
}

public function convertToPHPValue($value, AbstractPlatform $platform)
{
    return new Point($value[0],$value[1]);
}

public function convertToDatabaseValue($value, AbstractPlatform $platform)
{
    return "'".$value->getLongitude().','.$value->getLatitude()."'";
}

public function getName()
{
    return self::POINT;
}
}
Run Code Online (Sandbox Code Playgroud)

手动,我可以使用以下 SQL 插入此点:

INSERT INTO points (pointtype,name,score) VALUES ('2.43145,42.84214',"My Place",3241)
Run Code Online (Sandbox Code Playgroud)

但学说 DBAL,创建以下代码:

'INSERT INTO points (pointtype,name,score) VALUES (?,?,?)' with params ["'2.43145,42.84214'","My Place",3241]
Run Code Online (Sandbox Code Playgroud)

-> 我的点被解释为一个字符串...

我可以避免吗?

注意:我不想使用 PostGIS,只是来自 PostgreSQL 的本地点

Mic*_*bov 5

这是因为您只需要返回字符串,Doctrine 会自动用引号将其包裹起来。试试这个代码:

public function convertToDatabaseValue($value, AbstractPlatform $platform)
{
    return $value->getLongitude().','.$value->getLatitude();
}
Run Code Online (Sandbox Code Playgroud)

它将为您生成下一个 SQL 查询:

INSERT INTO points (pointtype,name,score) VALUES ("2.43145,42.84214","My Place",3241)
Run Code Online (Sandbox Code Playgroud)