1

次のdoctrine2クエリがうまく機能しています。地理的な半径内のすべての「マーカー」を取得します。

    $qb->select('marker')
        ->from('SndSpecialistLocator\Entity\Marker', 'marker')
        ->where('DISTANCE(marker.location, POINT_STR(:point)) < :distance')
        ->setParameter('point', $point)
        ->setParameter('distance', $radius);

次に、それらを距離順に並べ替えます。

    $qb->select('marker (DISTANCE(marker.location, POINT_STR(:point))) AS distance')
        ->from('SndSpecialistLocator\Entity\Marker', 'marker')
        ->where('DISTANCE(marker.location, POINT_STR(:point)) < :distance')
        ->setParameter('point', $point)
        ->orderBy('distance', 'DESC')
        ->setParameter('distance', $radius);

しかし、残念ながらこれは機能しません。距離はエンティティの実際のプロパティではなく、計算されたプロパティであるため、これは可能でしょうか?

ここでのトリックは何ですか?

4

3 に答える 3

2

または、select() の呼び出しで HIDDEN を使用してみてください。

$qb->select('m as marker, (DISTANCE(m.location, POINT_STR(:point))) as HIDDEN distance')
// note HIDDEN added here --->------->------->------->------->------->---^
    ->from('SndSpecialistLocator\Entity\Marker', 'm')
    ->where('DISTANCE(m.location, POINT_STR(:point)) < :distance')
    ->setParameter('point', $point)
    ->orderBy('distance', 'ASC')
    ->setParameter('distance', $radius)
    ->setMaxResults(5);

$query = $qb->getQuery();
$result = $query->execute();

HIDDEN を SELECT 句に追加すると、結果から隠されますが、orderby 句で使用できるようになります。$result には、余分な array_walk を実行しなくても、必要なオブジェクトが含まれている必要があります。

于 2014-04-23T18:07:01.123 に答える
0

解決策を見つけました。

   $qb->select('m as marker, (DISTANCE(m.location, POINT_STR(:point))) as distance')
        ->from('SndSpecialistLocator\Entity\Marker', 'm')
        ->where('DISTANCE(m.location, POINT_STR(:point)) < :distance')
        ->setParameter('point', $point)
        ->orderBy('distance', 'ASC')
        ->setParameter('distance', $radius)
        ->setMaxResults(5);

    $query = $qb->getQuery();
    $result = $query->execute();

    /**
     * Convert the resulting associative array into one containing only the entity objects
     *
     * array (size=5)
     *   0 =>
     *     array (size=2)
     *       'marker' =>
     *         object(SndSpecialistLocator\Entity\Marker)[647]
     *           protected 'id' => int 43
     *           protected 'title' => string 'c5d07acdd47efbe38a6d0bf4ec64f333' (length=32)
     *           private 'location' =>
     *             object(SndSpecialistLocator\Orm\Point)[636]
     *                private 'lat' => float 52.2897
     *                private 'lng' => float 4.84268
     *       'distance' => string '0.0760756823433058' (length=18)
     *   1 => ...
     *
     * array (size=5)
     *   0 =>
     *     object(SndSpecialistLocator\Entity\Marker)[647]
     *       protected 'id' => int 43
     *       protected 'title' => string 'c5d07acdd47efbe38a6d0bf4ec64f333' (length=32)
     *       private 'location' =>
     *         object(SndSpecialistLocator\Orm\Point)[636]
     *           private 'lat' => float 52.2897
     *           private 'lng' => float 4.84268
     *   1 => ...
     *
     */
    array_walk($result, function (&$item, $key)
    {
        $item = $item['marker'];
    });
于 2012-11-23T15:26:11.507 に答える
0

残念ながら、エイリアスによる注文はできません。代わりに*できることは、 orderBy ステートメントで関数を手動で繰り返すことです。

$qb->select('marker (DISTANCE(marker.location, POINT_STR(:point))) AS distance')
    ->from('SndSpecialistLocator\Entity\Marker', 'marker')
    ->where('DISTANCE(marker.location, POINT_STR(:point)) < :distance')
    ->setParameter('point', $point)
    ->orderBy('DISTANCE(marker.location, POINT_STR(:point))', 'DESC')
    ->setParameter('distance', $radius);

* DRY の聖なる道を踏み外したために、おそらく全員が開発地獄に陥ることになるでしょう。

于 2012-11-22T16:33:12.393 に答える