为后续查询重置条令ResultSetMapping



我在Zend Framework 2中使用Doctrine2。在一个非常独特的情况下,我需要创建一个本地SQL查询,它只选择表的id并进行一些地理计算。我遵循了文档并为这个查询创建了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 DoctrineORMMapping as ORM;
/**
 * @ORMEntity
 * @ORMTable(name="location")
 */
class Location extends RestrictedSite
{
/**
 * @ORMId
 * @ORMColumn(type="integer");
 * @ORMGeneratedValue(strategy="AUTO")
 *
 * @AnnotationExclude()
 *
 * @var int
 */
protected $id;
/**
 * @ORMColumn(type="string", length=255, name="name")
 *
 * @var string
 */
protected $name;
/**
 *
 * @ORMColumn(type="float")
 *
 * @var float
 */
protected $latitude;
/**
 *
 * @ORMColumn(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

在条令文档中找到:http://docs.doctrine-project.org/en/latest/reference/working-with-objects.html

我只需要调用$em->clear();来重置映射,整个实体就会在随后的DQL中水合。耶!

相关内容

  • 没有找到相关文章

最新更新