2016-03-20 14 views
2

Haritadaki bir dikdörtgenin içindeki tüm noktaları seçmek için DQL sorgusu yazmak istiyorum. Dikdörtgen, sol üst nokta ve sağ alt nokta ile tanımlanır. Daha fazla bilgi için bu link'a bakın.Dikdörtgenin içine jeo uzamsal noktalar elde etmek için DQL sorgusu dikdörtgenin içine girme

$qb = $this->em->createQueryBuilder() 
    ->select("m") 
    ->from($this->getEntityClassName(), "m") 
    ->where("ST_Within(m.geom, envelope(linestring(:topleft, :bottomright)))") 
    ->setParameter(":topleft", $topleft) 
    ->setParameter(":bottomright", $bottomright) 
    ->orderBy("m.date", "DESC"); 

alıyorum hatadır:

Bunu yapmak için, ben bu DQL sorgusu yazdı Bilgin

[Syntax Error] line 0, col 110: Error: Expected =, <, <=, <>, >, >=, !=, got 'ORDER' 

, ben sorgulama ediyorum varlık aşağıdaki gibi tanımlanan bir geom niteliği vardır :

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

Bilgileriniz için SQL sorgusu mükemmel çalışıyor. Şöyle ki:

SELECT *FROM MotorsAds WHERE 
st_within(point(lng, lat),   
envelope(linestring(point(10.090792984008772,36.83717099338201), 
point(10.310519546508772,36.749467295867646)))) 

I (bizim st_within böyle) DQL sayısal işlevler için kullanıyorum kütüphane creof/doctrine2-spatial olduğunu.

Düzeltmek için herhangi bir öneride bulunmaya hazır olun.

sayesinde

Sana önerilen çözümü denedik sorunun


Güncelleme şöyle:

$qb = $this->em->createQueryBuilder() 
     ->select("m") 
     ->from($this->getEntityClassName(), "m") 
     ->where(
      $this->em->createQueryBuilder()->expr()->eq(
        "ST_Within(m.geom, envelope(linestring(:topleft, :bottomright)))", 
        $this->em->createQueryBuilder()->expr()->literal(true) 
       ) 
     ) 
     ->setParameter(":topleft", $topleft) 
     ->setParameter(":bottomright", $bottomright) 
     ->orderBy("m.date", "DESC"); 

Yani, var hatadır:

'SELECT COUNT (*) AS dctrn_count FRO çalıştırılırken bir istisna oluştu. M (SELECT DISTINCT id_0 FROM (SELECT m0_.id AS id_0, m0_.price AS fiyat_1, m0_.year AS yıl2, m0_.km AS km_3, m0_.slug AS slug_4, m0_.title AS title_5, m0_.description AS description_6, m0_.address AS address_7, m0_.isPublished AS isPublished_8, m0_.delegation AS delegation_9, m0_.lat AS lat_10, m0_.lng AS lng_11, m0_.date AS date_12, m0_.count AS count_13, AsBinary (m0_.geom) AS geom_14 MotorsAds DAN m0_ WHERE ST_Within (? m0_.geom, Zarf (LineStringve (?,))) = parametrelerini [{}, {}] ile m0_.date TANIM) dctrn_result iLE 1 order) dctrn_table':

SQLSTATE [22007]: Geçersiz tarihyazı biçimi: 1367 Geçersiz olmayan geometrik olmayan ''10 .090792984009 36.837170993382' 'ayrıştırma sırasında bulunan değer

cevap

1

.

$qb = $this->em->createQueryBuilder() 
     ->select("m") 
     ->from($this->getEntityClassName(), "m") 
     ->where(
      $this->em->createQueryBuilder()->expr()->eq(
        sprintf("ST_Within(m.geom, envelope(linestring(point(:topleftX,:topleftY), point(:bottomrightX,:bottomrightY))))"), 
        $this->em->createQueryBuilder()->expr()->literal(true) 
       ) 
     ) 
     ->setParameter(":topleftX", $topleftX) 
     ->setParameter(":topleftY", $topleftY) 
     ->setParameter(":bottomrightX", $bottomrightX) 
     ->setParameter(":bottomrightY", $bottomrightY) 
     ->orderBy("m.date", "DESC"); 
2

onun:

$qb = $this->em->createQueryBuilder() 
    ->select("m") 
    ->from($this->getEntityClassName(), "m") 
    ->where(
     $queryBuilder->expr()->eq(
       "ST_Within(m.geom, envelope(linestring(:topleft, :bottomright)))", 
       $queryBuilder->expr()->literal(true) 
      ) 
    ) 
    ->setParameter(":topleft", $topleft) 
    ->setParameter(":bottomright", $bottomright) 
    ->orderBy("m.date", "DESC"); 

ben belgelerinden aldı: Aşağıdaki çözüm sorgu noktasını DQL için bir PHP noktası ve size dönüşüm problemini önleyecektir https://github.com/creof/doctrine2-spatial/blob/master/doc/index.md

+0

Cevabınız için teşekkür ederiz @Miro. Sorumu güncelliyorum. Yorum yazabilir miyim? –

+0

Önerilen çözümün problemi, noktaların dönüşümüdür .... Aşağıda benim çözümüm. Teşekkürler @Miro tekrar –

+0

İyi iş, Amin – Miro

İlgili konular