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