2012-09-20 49 views
0

我想用使用本機查詢「As」子句來設置類屬性:Doctrine2本地查詢水化錯誤「爲」

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的註釋

,我得到一個錯誤:

Notice: Undefined index: area_int in /var/www/incra/vendor/doctrine/lib/Doctrine/ORM/Internal/Hydration/AbstractHydrator.php line 205

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

回答

0

使用的executeQuery沒有DQL

0

你的天堂」 t標記爲area_int作爲數據列(班級中的第120行)。由於您在字段結果($rsm->addFieldResult('o', 'area_int', 'area_int');)中列出了area_int,所以Doctrine試圖將該列映射到實體,但無法找到它。試着用

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

而且修改你的類,只是爲了安全/性能/咕代碼風格的/ etc着想。您直接在查詢字符串中注入$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-注射。

+0

使用本機,但「area_int」不要在數據庫表中的列,是PSQL函數的返回,我不想讓這個一列。我知道$ pontos,但這個值直接獲得數據庫,並驗證插入 –

+0

verifield插入* –