Symfony2和Doctrine实体未定义的方法

时间:2014-04-30 20:34:16

标签: php symfony doctrine-orm doctrine

我和The method name must start with either findBy or findOneBy. Undefined method Symfony?有同样的问题,但答案没有帮助。 当我运行我的代码时

<?php

namespace Map\ViewBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Map\ViewBundle\Entity\Markers;

class DefaultController extends Controller
{
    public function getMarkersAction()
    {
        $em = $this->getDoctrine()->getManager();
        $em->getRepository('MapViewBundle:Markers')
            ->findAllMarkers();
    }
    //...   
}

我得到例外

  

未定义的方法'findAllMarkers'。方法名称必须以   findBy或findOneBy!

这是我的MarkersRepository文件(位于Entity目录中)

<?php

namespace Map\ViewBundle\Entity;
use Doctrine\ORM\EntityRepository;

class MarkersRepository extends EntityRepository
{
    public function  findAllMarkers() {
        //this query will be different
        return $this->getEntityManager()
            ->createQuery(
                'SELECT m FROM MapViewBundle:Markers m'
            )
            ->getResult();
    }
}

这是Markers实体类(也位于Entity目录中)

<?php

namespace Map\ViewBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Table(name="markers")
 * @ORM\Entity(repositoryClass="Map\ViewBundle\Entity\MarkersRepository")
 */
class Markers
{
    /**
     * @var string
     *
     * @ORM\Column(name="name", type="string", length=100, nullable=false)
     */
    private $name;

    /**
     * @var string
     *
     * @ORM\Column(name="description", type="string", length=500, nullable=false)
     */
    private $description;

    /**
     * @var integer
     *
     * @ORM\Column(name="icon", type="integer", nullable=false)
     */
    private $icon;

    /**
     * @var \DateTime
     *
     * @ORM\Column(name="post_date", type="datetime", nullable=false)
     */
    private $postDate;

    /**
     * @var float
     *
     * @ORM\Column(name="lat", type="float", precision=10, scale=0, nullable=false)
     */
    private $lat;

    /**
     * @var float
     *
     * @ORM\Column(name="lng", type="float", precision=10, scale=0, nullable=false)
     */
    private $lng;

    /**
     * @var integer
     *
     * @ORM\Column(name="relevance_degree", type="integer", nullable=false)
     */
    private $relevanceDegree;

    /**
     * @var string
     *
     * @ORM\Column(name="geohash", type="string", length=12, nullable=false)
     */
    private $geohash;

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

    /**
     * @var \Doctrine\Common\Collections\Collection
     *
     * @ORM\ManyToMany(targetEntity="Map\ViewBundle\Entity\Tags", inversedBy="idMarkers")
     * @ORM\JoinTable(name="markers_tags",
     *   joinColumns={
     *     @ORM\JoinColumn(name="id_markers", referencedColumnName="id")
     *   },
     *   inverseJoinColumns={
     *     @ORM\JoinColumn(name="id_tags", referencedColumnName="id")
     *   }
     * )
     */
    private $idTags;

    /**
     * Constructor
     */
    public function __construct()
    {
        $this->idTags = new \Doctrine\Common\Collections\ArrayCollection();
    }


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

        return $this;
    }

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

    /**
     * Set description
     *
     * @param string $description
     * @return Markers
     */
    public function setDescription($description)
    {
        $this->description = $description;

        return $this;
    }

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

    /**
     * Set icon
     *
     * @param integer $icon
     * @return Markers
     */
    public function setIcon($icon)
    {
        $this->icon = $icon;

        return $this;
    }

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

    /**
     * Set postDate
     *
     * @param \DateTime $postDate
     * @return Markers
     */
    public function setPostDate($postDate)
    {
        $this->postDate = $postDate;

        return $this;
    }

    /**
     * Get postDate
     *
     * @return \DateTime 
     */
    public function getPostDate()
    {
        return $this->postDate;
    }

    /**
     * Set lat
     *
     * @param float $lat
     * @return Markers
     */
    public function setLat($lat)
    {
        $this->lat = $lat;

        return $this;
    }

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

    /**
     * Set lng
     *
     * @param float $lng
     * @return Markers
     */
    public function setLng($lng)
    {
        $this->lng = $lng;

        return $this;
    }

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

    /**
     * Set relevanceDegree
     *
     * @param integer $relevanceDegree
     * @return Markers
     */
    public function setRelevanceDegree($relevanceDegree)
    {
        $this->relevanceDegree = $relevanceDegree;

        return $this;
    }

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

    /**
     * Set geohash
     *
     * @param string $geohash
     * @return Markers
     */
    public function setGeohash($geohash)
    {
        $this->geohash = $geohash;

        return $this;
    }

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

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

    /**
     * Add idTags
     *
     * @param \Map\ViewBundle\Entity\Tags $idTags
     * @return Markers
     */
    public function addIdTag(\Map\ViewBundle\Entity\Tags $idTags)
    {
        $this->idTags[] = $idTags;

        return $this;
    }

    /**
     * Remove idTags
     *
     * @param \Map\ViewBundle\Entity\Tags $idTags
     */
    public function removeIdTag(\Map\ViewBundle\Entity\Tags $idTags)
    {
        $this->idTags->removeElement($idTags);
    }

    /**
     * Get idTags
     *
     * @return \Doctrine\Common\Collections\Collection 
     */
    public function getIdTags()
    {
        return $this->idTags;
    }
}

我尝试清除缓存并使用命令

php app/console doctrine:generate:entities Map

但仍然是例外。有人看到我的代码有什么问题吗?

解决方案 Map \ ViewBundle \ Resources \ config \ doctrine 目录中删除文件: Markers.orm.yml Tags.orm.yml 是解决方案。

2 个答案:

答案 0 :(得分:3)

首先验证您没有获得正确的存储库。

$repo = $em->getRepository('MapViewBundle:Markers')
die('Repo Class ' . get_class($repo));

如果你碰巧得到了正确的课程,那么你就会输入错字。

并确保您没有任何doctrine / markers.orm.yml或xml文件。

最后,使用app / config / config.yml

中的doctrine部分更新您的问题

答案 1 :(得分:0)

这可能听起来很奇怪,但我遇到了与自定义存储库功能类似的问题。 尝试将您的Repository函数重命名为getAllMarkers()并更新控制器中的调用,然后重试。这解决了我当时的问题。