编写Doctrine2查询以连接两个空间表

时间:2013-10-31 02:28:48

标签: symfony join doctrine-orm postgis spatial

我在启用了PostGIS的Postgre数据库上使用Symfony和Doctrine2。我有两个表 - 属性和邻域具有以下结构:

class Property  {

/**
 * @ORM\Id
 * @ORM\Column(type="integer")
 * @ORM\GeneratedValue(strategy="AUTO")
 */
protected $id;

/**
 * @ORM\Column(type="string")
 */
protected $address;

/**
 * @var Point $geom
 * @ORM\Column(type="Point", nullable=true)
 */
protected $geom;
}

class Neighborhood  {

/**
 * @ORM\Id
 * @ORM\Column(type="integer")
 * @ORM\GeneratedValue(strategy="AUTO")
 */
 protected $gid;

 /**
 * @ORM\Column(type="string")
 */
 protected $name;

 /**
 * @ORM\Column(type="string")
 */     
 protected $description;

 /**
 * @var Polygon $geom
 *
 * @ORM\Column(type="Polygon", nullable=true)
 */
 protected $geom;
 }

在pgAdminIII中,我可以编写以下查询,该工作正常:

SELECT address, neighborhood.name
FROM property
JOIN neighborhood
ON ST_Contains(neighborhood.geom, property.geom)

如何在DQL中编写?我理解连接的基础知识并添加Doctrine2映射的注释,但我不知道如何进行连接,因为两个字段不相等。我需要使用ST_Contains函数来创建连接。 我正在使用djlambert / doctrine2-spatial包进行空间数据类型和映射。我可以单独查询每个表并在每个表上创建地图,但不知道如何选择给定邻域中的所有属性。

2 个答案:

答案 0 :(得分:3)

我想出来并希望发布以防其他人有类似的问题。我需要让ST_Contains成为条件的一部分而不仅仅是函数。

使用createQueryBuilder,语法如下:

 $qb = $this->createQueryBuilder('n')              
            ->select("p.address as address, n.ntaname, ST_AsText(p.geom) as function")                
            ->join('Bundle\Entity\Property', 'p', 'WITH', 'ST_Contains(n.geom4326,p.geom)=true');        


    return $qb->getQuery()
                    ->getResult();

答案 1 :(得分:0)

这不是一个真正的答案,只是对@ George的代码的评论。

对我来说,使用creof/doctrine2-spatial:0.0.1symfony/symfony:2.3.*时,注释需要为小写,以便使用php app/console doctrine:schema:validate验证架构,如下所示:

/**
 * @var Point $geom
 * @ORM\Column(type="point", nullable=true)
 */
protected $geom;

在大写情况下,我不断收到此错误消息:

  [Doctrine\DBALDBALException]                                                                                                 
  Unknown column type "Point" requested. Any Doctrine type that you use has to be registered with \Doctrine\DBAL\Types\Type::addType(). [...]