0

Zend Framework 2 で Doctrine2 を使用しています。非常に特殊なケースとして、テーブルの ID のみを選択し、地理的な計算を行うネイティブ SQL クエリを作成する必要があります。ドキュメントに従って、このクエリの ResultSetMapping 定義を作成しました。

$rsm = new ResultSetMapping();
$rsm->addEntityResult('Location', 'l');
$rsm->addFieldResult('l', 'id', 'id');
$rsm->addScalarResult('distance', 'distance');
$query = $em->createNativeQuery('SELECT l.id, (3959 * acos(cos(radians(:lat))
        * cos( radians( l.latitude ) )
        * cos( radians( l.longitude ) - radians(:lng) )
        + sin( radians(:lat) )
        * sin( radians( l.latitude ) ) ) ) AS distance
    FROM location l
    WHERE
    l.latitude BETWEEN (:lat - .2) AND (:lat + .2)
    AND l.longitude BETWEEN (:lng -.2) AND (:lng + .2)
    HAVING distance < 10 ORDER BY distance'), $rsm);
$query->setParameter('lng', $lng)
    ->setParameter('lat', $lat)

これは結果セットを正しく返し、私はそれを処理します。

ただし、これらのエンティティの完全に水和されたコレクションを返したいので、単純な DQL クエリを実行します

$em->createQuery('SELECT l FROM Location l WHERE l.id IN (:locations)')
    ->setParameter('locations', $locationIds)
    ->getResult();

結果として得られるエンティティのコレクションには、「id」フィールドのみが水和されています。他のすべての値は null です。

これは、前のクエリに ResultSetMapping を設定し、その後 DQL にも適用されているためだと思われます。Doctrine のマッピング動作をデフォルトにリセットするにはどうすればよいですか?

編集

これは、Location エンティティの切り詰められたバージョンです。それは、サイトの他のすべての領域で問題なく水和します。

<?php

use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity
 * @ORM\Table(name="location")
 */
class Location extends RestrictedSite
{
/**
 * @ORM\Id
 * @ORM\Column(type="integer");
 * @ORM\GeneratedValue(strategy="AUTO")
 *
 * @Annotation\Exclude()
 *
 * @var int
 */
protected $id;
/**
 * @ORM\Column(type="string", length=255, name="name")
 *
 * @var string
 */
protected $name;

/**
 *
 * @ORM\Column(type="float")
 *
 * @var float
 */
protected $latitude;

/**
 *
 * @ORM\Column(type="float")
 *
 * @var float
 */
protected $longitude;


... more columns & methods ...
}

スキーマは次のようなものです。

CREATE TABLE `location` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) DEFAULT NULL,
  `latitude` float DEFAULT NULL,
  `longitude` float DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB
4

1 に答える 1

1

ここのドクトリン ドキュメントで見つけました: http://docs.doctrine-project.org/en/latest/reference/working-with-objects.html

マッピングをリセットするために呼び出すだけ$em->clear();で、エンティティ全体が後続の DQL でハイドレートされます。わーい!

于 2013-08-01T20:18:35.487 に答える