2016-03-20 11 views
2

Ich möchte DQL-Abfrage schreiben, um alle Punkte innerhalb eines Rechtecks ​​in der Karte zu wählen. Das Rechteck wird durch den oberen linken Punkt und den unteren rechten Punkt definiert. Siehe hierzu link für weitere Details.DQL-Abfrage für geo räumliche Punkte st_within einem Rechteck

$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"); 

Der Fehler Ich erhalte ist:

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

Zu Ihrer Information, Organisation ich Abfrage bin hat ein geom Attribut wie folgt definiert

so zu tun, ich diese DQL-Abfrage geschrieben :

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

Zu Ihrer Information funktioniert die SQL-Abfrage einwandfrei. Es ist wie folgt:

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

Die Bibliothek verwende ich für DQL numerische Funktionen (wie uns st_within) ist creof/doctrine2-spatial.

Bereit, jeden Vorschlag zu nehmen, um das zu beheben.

Danke,


Update der Frage

ich die Lösung versucht, wie folgt vorgeschlagen:

$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"); 

Also habe ich ist, der Fehler:

Während der Ausführung von 'SELECT COUNT (*) AS dctrn_count FRO' ist eine Ausnahme aufgetreten M (SELECT DISTINCT id_0 VON (SELECT m0_.id AS id_0, m0_.price AS price_1, m0_.year AS Jahr_2, m0_.km AS km_3, m0_.slug AS slug_4, m0_.title AS title_5, m0_.beschreibung AS Beschreibung_6, m0_.address AS-Adresse_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 FROM MotorsAds m0_ WHERE ST_Within (? m0_.geom, Envelope (Linestring (?,))) = 1 ORDER BY m0_.date DESC) dctrn_result) dctrn_table‘mit params [{}, {}]:

SQLSTATE- [22007]: Ungültiges Datum/Uhrzeit-Format: 1367 Illegal nicht geometrisch '' 10 .090792984009 36.837170993382 '' Wert beim Parsen gefunden

Antwort

1

Die Lösung unten ein PHP Punkt Sie das Problem der Umwandlung verhindert Abfrage Punkt dql.

$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

Probieren Sie t sein:

$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"); 

Ich nahm es von der Dokumentation: https://github.com/creof/doctrine2-spatial/blob/master/doc/index.md

+0

Vielen Dank @Miro für Sie zu antworten. Ich aktualisiere meine Frage. Kann ich dich kommentieren? –

+0

Das Problem der von Ihnen vorgeschlagenen Lösung ist die Umwandlung der Punkte .... Unten ist meine Lösung. Danke @Miro wieder –

+0

Gute Arbeit, Amin – Miro