0

我想使用使用'as'子句的本机查询来设置类属性:

public function findIntersects($id,$pontos){

$em = $this->getEntityManager();

 $sql = "SELECT p.imovel,p.id,ST_Area(ST_Intersection(p.location,'POLYGON((".$pontos."))')) as area_int, ST_Area(p.location) as area from propriedades p where ST_Intersects(p.location,'POLYGON((".$pontos."))') and id !=:id";

$rsm = new ResultSetMapping;
$rsm->addEntityResult('Incra\PropriedadesBundle\Entity\Propriedades', 'o');
$rsm->addFieldResult('o', 'id', 'id');
$rsm->addFieldResult('o', 'imovel', 'imovel');
$rsm->addFieldResult('o', 'area_int', 'area_int');
$rsm->addFieldResult('o', 'area', 'area');

 $qns = $this->_em->createNativeQuery($sql, $rsm);
$qns->setParameter("id", $id);
$qns->setParameter("pontos", $pontos);


  return $qns->getResult();


}

我在我的班级中有这个属性,但没有 orm 的注释

我得到一个错误:

注意:未定义索引:/var/www/incra/vendor/doctrine/lib/Doctrine/ORM/Internal/Hydration/AbstractHydrator.php 第 205 行中的 area_int

我的课: http: //pastebin.com/jd3gcr93

4

2 回答 2

0

您尚未标记area_int为数据列(您班级的第 120 行)。由于您已area_int在字段结果 ( $rsm->addFieldResult('o', 'area_int', 'area_int');) 中列出,因此 Doctrine 尝试将该列映射到实体,但找不到它。尝试修改你的类

/**@ORM\Column(name="area_int", type="int")*/
private $area_int;

另外,只是为了安全/性能/goo代码样式/等。您直接注入$pontos查询字符串。这会使您的代码受到 SQL 注入的影响。稍后,您添加$pontos为参数。这两种方法是多余的,因此您最好删除其中一种。我肯定会尝试使用参数方法,所以你的查询变成了

SELECT p.imovel,p.id,ST_Area(ST_Intersection(p.location,'POLYGON((:pontos))')) as area_int, 
       ST_Area(p.location) as area from propriedades p 
where ST_Intersects(p.location,'POLYGON((:pontos))') and id !=:id

如果它不起作用,您可以删除$qns->setParameter("pontos", $pontos);,但是您应该执行尽可能多的完整性检查和验证以防止 SQL 注入。

于 2012-09-20T19:13:04.227 回答
0

使用executeQuery 使用native 没有dql

于 2013-03-20T18:38:26.280 回答