symfony2 doctrine ResultSetMapping error

5.8k views Asked by At

Here I am try to use ResultSetMapping to map the result which generate by nativeQuery. But I have no idea about why the doctrine always throw Undefined index error. anyone can help me out from this problem? Here is my code: the PlaceMarkerRepository:

namespace Leo\FoodRadarBundle\Entity;

use Doctrine\ORM\EntityRepository;
use Doctrine\ORM\Query\ResultSetMappingBuilder;


/**
 * PlaceMarkerRepository
 *
 * This class was generated by the Doctrine ORM. Add your own custom
 * repository methods below.
 */
class PlaceMarkerRepository extends EntityRepository
{
    public function findNearBy($query,$lat, $lng, $radius){

        $rsm = new ResultSetMappingBuilder($this->getEntityManager());
        // $rsm = new ResultSetMappingBuilder();
        // $rsm->addRootEntityFromClassMetadata('LeoFoodRadarBundle:PlaceMarker', 'p');
        // $rsm->addJoinedEntityFromClassMetadata('LeoFoodRadarBundle:Coordinate', 'c', 'p', 'coordinate', array('id' => 'coordinate_id'));

        $rsm->addEntityResult('LeoFoodRadarBundle:PlaceMarker', 'p');
        $rsm->addFieldResult('p', 'id', 'id');
        $rsm->addFieldResult('p', 'name', 'name');
        $rsm->addJoinedEntityResult('LeoFoodRadarBundle:Coordinate' , 'c', 'p', 'coordinate');
        $rsm->addFieldResult('c', 'coordinate_id', 'id');
        $rsm->addFieldResult('c', 'latitude', 'latitude');
        $rsm->addFieldResult('c', 'longitude', 'longitude');



        $sql ="SELECT p.id, p.name, c.latitude, c.longitude, c.id as coordinate_id
                FROM placeMarker p join coordinate c on p.coordinate_id = c.id
                ";

         $this->getEntityManager()->createNativeQuery($sql, $rsm)->getResult();



    }
}

and PlaceMark:

namespace Leo\FoodRadarBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * Leo\FoodRadarBundle\Entity\PlaceMarker
 *
 * @ORM\Table(name="placeMarker")
 * @ORM\Entity(repositoryClass="Leo\FoodRadarBundle\Entity\PlaceMarkerRepository")
 */
class PlaceMarker {

    /**
     * @var integer $id
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @var Coordinate coordinate 
     * @ORM\OneToOne(targetEntity="Coordinate") 
     * @ORM\JoinColumn(name="coordinate_id", referencedColumnName="id")
     */
    private $coordinate;

    /**
     *
     * @var Address address
     * @ORM\OneToOne(targetEntity="Address") 
     * @ORM\JoinColumn(name="address_id", referencedColumnName="id")
     */
    private $address;


    /**
     *
     * @ORM\Column(name="name", type="string", length=100)
     */
    private $name;

    /**
     * Get id
     *
     * @return integer 
     */
    public function getId() {
        return $this->id;
    }

    /**
     * Set coordinate
     *
     * @param Leo\FoodRadarBundle\Entity\Coordinate $coordinate
     * @return PlaceMarker
     */
    public function setCoordinate(\Leo\FoodRadarBundle\Entity\Coordinate $coordinate = null) {
        $this->coordinate = $coordinate;

        return $this;
    }

    /**
     * Get coordinate
     *
     * @return Leo\FoodRadarBundle\Entity\Coordinate 
     */
    public function getCoordinate() {
        return $this->coordinate;
    }

    /**
     * Set address
     *
     * @param Leo\FoodRadarBundle\Entity\Address $address
     * @return PlaceMarker
     */
    public function setAddress(\Leo\FoodRadarBundle\Entity\Address $address = null) {
        $this->address = $address;

        return $this;
    }

    /**
     * Get address
     *
     * @return Leo\FoodRadarBundle\Entity\Address 
     */
    public function getAddress() {
        return $this->address;
    }



    /**
     * Set name
     *
     * @param string $name
     * @return PlaceMarker
     */
    public function setName($name)
    {
        $this->name = $name;

        return $this;
    }

    /**
     * Get name
     *
     * @return string 
     */
    public function getName()
    {
        return $this->name;
    }
}

The Coordinate:

<?php

namespace Leo\FoodRadarBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * Leo\FoodRadarBundle\Entity\Coordinate
 *
 * @ORM\Table(name="coordinate")
 * @ORM\Entity
 */
class Coordinate
{
    /**
     * @var integer $id
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

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

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

    /**
     * Get id
     *
     * @return integer 
     */
    public function getId()
    {
        return $this->id;
    }


    /**
     * Get longitude
     * @return float 
     */
    public function getLongitude() {
        return $this->longitude;
    }

    /**
     * Set longitude
     */
    public function setLongitude($longitude) {
        $this->longitude = $longitude;
    }

    /**
     * Get Latitude
     * @return float 
     */
    public function getLatitude() {
        return $this->latitude;
    }

    /**
     * Set Latitude
     */
    public function setLatitude($latitude) {
        $this->latitude = $latitude;
    }


}

the error caused by this statement:

$targetClass = $this->_ce[$relation['targetEntity']];

the information about error is:

Notice: Undefined index: Leo\FoodRadarBundle\Entity\Coordinate in /Volumes/DATA/LEO/Sites/FoodRadar/vendor/doctrine/orm/lib/Doctrine/ORM/Internal/Hydration/ObjectHydrator.php line 427 

 ErrorHandler ->handle ('8', 'Undefined index: Leo\FoodRadarBundle\Entity\Coordinate', '/Volumes/DATA/LEO/Sites/FoodRadar/vendor/doctrine/orm/lib/Doctrine/ORM/Internal/Hydration/ObjectHydrator.php', '427', array('row' => array('id' => '1', 'name' => 'test', 'latitude' => '233.234342', 'longitude' => '-232.23232323232', 'coordinate_id' => '2'), 'cache' => array('id' => array('fieldName' => 'id', 'type' => object(IntegerType), 'isIdentifier' => true, 'dqlAlias' => 'p'), 'name' => array('fieldName' => 'name', 'type' => object(StringType), 'isIdentifier' => false, 'dqlAlias' => 'p'), 'latitude' => array('fieldName' => 'latitude', 'type' => object(FloatType), 'isIdentifier' => false, 'dqlAlias' => 'c'), 'longitude' => array('fieldName' => 'longitude', 'type' => object(FloatType), 'isIdentifier' => false, 'dqlAlias' => 'c'), 'coordinate_id' => array('fieldName' => 'id', 'type' => object(IntegerType), 'isIdentifier' => true, 'dqlAlias' => 'c')), 'result' => array(object(PlaceMarker)), 'id' => array('p' => '|1', 'c' => '|2'), 'nonemptyComponents' => array('p' => true, 'c' => true), 'rowData' => array('p' => array('id' => '1', 'name' => 'test'), 'c' => array('latitude' => '233.234342', 'longitude' => '-232.23232323232', 'id' => '2')), 'dqlAlias' => 'c', 'data' => array('latitude' => '233.234342', 'longitude' => '-232.23232323232', 'id' => '2'), 'entityName' => 'LeoFoodRadarBundle:Coordinate', 'parentAlias' => 'p', 'path' => 'p.c', 'parentObject' => object(PlaceMarker), 'parentClass' => object(ClassMetadata), 'oid' => '000000003e34db9d00000000492221b6', 'relationField' => 'coordinate', 'relation' => array('fieldName' => 'coordinate', 'targetEntity' => 'Leo\FoodRadarBundle\Entity\Coordinate', 'joinColumns' => array(array('name' => 'coordinate_id', 'unique' => true, 'nullable' => true, 'onDelete' => null, 'columnDefinition' => null, 'referencedColumnName' => 'id')), 'mappedBy' => null, 'inversedBy' => null, 'cascade' => array(), 'orphanRemoval' => false, 'fetch' => '2', 'type' => '1', 'isOwningSide' => true, 'sourceEntity' => 'Leo\FoodRadarBundle\Entity\PlaceMarker', 'isCascadeRemove' => false, 'isCascadePersist' => false, 'isCascadeRefresh' => false, 'isCascadeMerge' => false, 'isCascadeDetach' => false, 'sourceToTargetKeyColumns' => array(*DEEP NESTED ARRAY*), 'joinColumnFieldNames' => array(*DEEP NESTED ARRAY*), 'targetToSourceKeyColumns' => array(*DEEP NESTED ARRAY*)), 'reflField' => object(ReflectionProperty), 'reflFieldValue' => null, 'element' => object(Coordinate), 'entityKey' => '0', 'resultKey' => '0'))
in /Volumes/DATA/LEO/Sites/FoodRadar/vendor/doctrine/orm/lib/Doctrine/ORM/Internal/Hydration/ObjectHydrator.php at line 427  -+
1

There are 1 answers

3
leoyfm On BEST ANSWER

Finally, I found the reason why caused this problem. I think this because resultsetmapping runs internally, So it can't understand the logic name which provide by Symfony. The solution for this problem is that changing logical name to full path name. then it will work.