Orm 在条令2.1.7中添加自定义数据类型(几何体)。未调用方法canRequireSQLConversion()

Orm 在条令2.1.7中添加自定义数据类型(几何体)。未调用方法canRequireSQLConversion(),orm,types,doctrine,doctrine-orm,geometry,Orm,Types,Doctrine,Doctrine Orm,Geometry,我试图将几何类型添加到学说中。我的DBAL版本和ORM版本是2.1.7 我尝试按照这里的说明进行操作: 我成功创建了新的数据类型,但convertToPHPValueSQL方法存在问题。我希望在从数据库(数据库是PostgreSQL 9.1+PostGIS 2.0.0)获取几何体列时,始终调用函数ST_AsText(“..”) 原则DBAL 2.1文档如下所示: DBAL的工作是将您的类型转换为SQL 宣言。您可以修改将产生的SQL声明原则。 首先,您必须通过覆盖 canRequireSQLC

我试图将几何类型添加到学说中。我的DBAL版本和ORM版本是2.1.7

我尝试按照这里的说明进行操作:

我成功创建了新的数据类型,但convertToPHPValueSQL方法存在问题。我希望在从数据库(数据库是PostgreSQL 9.1+PostGIS 2.0.0)获取几何体列时,始终调用函数ST_AsText(“..”)

原则DBAL 2.1文档如下所示:

DBAL的工作是将您的类型转换为SQL 宣言。您可以修改将产生的SQL声明原则。 首先,您必须通过覆盖 canRequireSQLConversion方法:


但如果我真的喜欢这个:

$entity=$em->find('\minupanderad\Entities\Field',1);
Doctrine对数据库的SQL请求如下:

选择t0.id作为id1,t0.fieldNumber作为fieldnumber2,t0.geometry作为geometry3,t0.user\u id作为user\u id4
从myfields.fields t0
其中t0.id=?
条令不使用我的convertToPHPValueSQL方法,尽管canRequireSQLConversion()返回true。此外,我还添加了一些调试代码,以查看是否调用了canRequireSQLConversion(),而没有调用它。我做错了什么

PS:我试图搜索堆栈溢出,但我只找到了一个链接,链接到我已经阅读过的条令2.1.x手册

编辑:我将在这里阅读:

EDIT2:修复了我的代码中错误的函数getSqlDeclaration()。补充评论

这似乎是一个更完整的教程。

找到了答案

在原则2.1.7中,如果我使用$em->find(),最终会调用BasicEntityPersister()。它有以下代码:(取自)

此代码显然不支持方法“canRequireSQLConversion”

在最新的条令版本2.3.1中(见):

所以答案是更新我的ORM

/**
 * Gets the SQL snippet of a qualified column name for the given field name.
 *
 * @param string $field The field name.
 * @param ClassMetadata $class The class that declares this field. The table this class is
 * mapped to must own the column for the given field.
 * @param string $alias
 */
protected function _getSelectColumnSQL($field, ClassMetadata $class, $alias = 'r')
{
    $columnName = $class->columnNames[$field];
    $sql = $this->_getSQLTableAlias($class->name, $alias == 'r' ? '' : $alias) . '.' . $class->getQuotedColumnName($field, $this->_platform);
    $columnAlias = $this->_platform->getSQLResultCasing($columnName . $this->_sqlAliasCounter++);
    $this->_rsm->addFieldResult($alias, $columnAlias, $field);

    return "$sql AS $columnAlias";
}
/**
 * Gets the SQL snippet of a qualified column name for the given field name.
 *
 * @param string $field The field name.
 * @param ClassMetadata $class The class that declares this field. The table this class is
 * mapped to must own the column for the given field.
 * @param string $alias
 */
protected function _getSelectColumnSQL($field, ClassMetadata $class, $alias = 'r')
{
    $sql = $this->_getSQLTableAlias($class->name, $alias == 'r' ? '' : $alias)
         . '.' . $this->quoteStrategy->getColumnName($field, $class, $this->_platform);
    $columnAlias = $this->getSQLColumnAlias($class->columnNames[$field]);

    $this->_rsm->addFieldResult($alias, $columnAlias, $field);

    if (isset($class->fieldMappings[$field]['requireSQLConversion'])) {
        $type = Type::getType($class->getTypeOfField($field));
        $sql = $type->convertToPHPValueSQL($sql, $this->_platform);
    }

    return $sql . ' AS ' . $columnAlias;
}