postgresql - 在 Doctrine2 中配置原生 Point PostgreSQL 类型

标签 postgresql symfony doctrine-orm doctrine

尝试使用 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;
}
}

Manualy,我可以用下面的 SQL 插入这个点:

INSERT INTO points (pointtype,name,score) VALUES ('2.43145,42.84214',"My Place",3241)

但是 Doctrine DBAL,创建以下代码:

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

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

我可以避免吗?

注意:我不想使用 PostGIS,只使用 PostgreSQL 中的原生点

最佳答案

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

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

它将生成下一个 SQL 查询:

INSERT INTO points (pointtype,name,score) VALUES ("2.43145,42.84214","My Place",3241)

关于postgresql - 在 Doctrine2 中配置原生 Point PostgreSQL 类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27357726/

相关文章:

php - 在同一个 PHP 脚本中使用 MySQL 和 PostgreSQL

sql - INSERT ... 在发生冲突时什么都不做 - 读取 csv 并生成外键表

symfony - 不能在不选择至少一个根实体别名的情况下通过标识变量选择实体

Symfony 2 onDelete setNull

symfony - 唯一实体不起作用

ruby-on-rails - 在 ruby​​ on rails 3.2 中实现连接时出错

sql - 如何在 Golang 中正确扫描 array_agg 函数的结果?

Symfony 4 自定义约束 atPath 不起作用

Symfony 6.1 重置密码 php 8.1

php - 更正 Oracle 上的 Doctrine 日期时间