我正在通过Symfony2的第4部分,并在更新控制器和帮助程序类代码时,我收到以下错误消息
Undefined method 'getLatestBlogs'. The method name must start with either
findBy or findOneBy!
Run Code Online (Sandbox Code Playgroud)
在我将一些代码放入控制器之前,我按照教程的教导转移到了我的助手类,这导致了上述错误消息.
<?php
// src/Blogger/BlogBundle/Repository/BlogRepository.php
namespace Blogger\BlogBundle\Repository;
use Doctrine\ORM\EntityRepository;
/**
* BlogRepository
* This class was generated by the Doctrine ORM. Add your own custom
* repository methods below.
*/
class BlogRepository extends EntityRepository
{
public function getLatestBlogs($limit = null)
{
$qb = $this->createQueryBuilder('b')
->select('b')
->addOrderBy('b.created', 'DESC');
if (false === is_null($limit))
$qb->setMaxResults($limit);
return $qb->getQuery()
->getResult();
}
}
Run Code Online (Sandbox Code Playgroud)
这是我的控制器文件索引操作代码: -
// src/Blogger/BlogBundle/Controller/PageController.php
class PageController extends Controller
{
public function indexAction()
{
$em = $this->getDoctrine()
->getEntityManager();
$blogs = $em->getRepository('BloggerBlogBundle:Blog')
->getLatestBlogs();
return $this->render('BloggerBlogBundle:Page:index.html.twig', array(
'blogs' => $blogs
));
}
// ..
}
Run Code Online (Sandbox Code Playgroud)
我从/Entity/Blog.php文件中附加几行.请根据你的答案看看它们是否正确.
<?php
// src/Blogger/BlogBundle/Entity/Blog.php
namespace Blogger\BlogBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
* @ORM\Entity(repositoryClass="Blogger\BlogBundle\Repository\BlogRepository")
* @ORM\Table(name="blog")
* @ORM\HasLifecycleCallbacks()
* @ORM\Entity
*/
class Blog
{
/**
* @ORM\Id
* @ORM\Column(type="integer")
* @ORM\GeneratedValue(strategy="AUTO")
* @ORM\HasLifecycleCallbacks()
*/
protected $id;
--
--
}
Run Code Online (Sandbox Code Playgroud)
我在哪里做错了?
Mol*_*Man 133
确保您已修改实体类:
// src/Blogger/BlogBundle/Entity/Blog.php
/**
* @ORM\Entity(repositoryClass="Blogger\BlogBundle\Repository\BlogRepository")
* @ORM\Table(name="blog")
* @ORM\HasLifecycleCallbacks()
*/
class Blog
{
// ..
}
Run Code Online (Sandbox Code Playgroud)
注释@ORM\Entity(repositoryClass="Blogger\BlogBundle\Repository\BlogRepository")
是必需的.
并且不要忘记重新生成实体:
php app/console doctrine:generate:entities Blogger
Run Code Online (Sandbox Code Playgroud)
删除注释@ORM\Entity
.它会覆盖正确的注释@ORM\Entity(repositoryClass="Blogger\BlogBundle\Repository\BlogRepository")
在我的情况下,添加适当的注释是不够的.
删除Doctrine Cache php app/console doctrine:cache:clear-metadata
也没有用.
我通过命令从数据库生成我的实体
php app/console doctrine:mapping:import --force AcmeBlogBundle xml
php app/console doctrine:mapping:convert annotation ./src
php app/console doctrine:generate:entities AcmeBlogBundle
第一个命令为我的项目中的每个数据库表生成orm.xml文件.删除所有orm.xml文件后,注释开始正常工作.