今天我陷入了Repository Class Function我遇到了这个错误
未定义的方法'test'。方法名称必须以findBy或findOneBy!
开头我已经检查了这些解决方案 - Solution 1 Solution 2 Solution 3
我需要添加到配置文件中吗?
这是我的实体类
// src/Foo/NewsBundle/Entity/News.php
namespace Foo\NewsBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
* News
* @ORM\Entity(repositoryClass="Foo\NewsBundle\Repository\NewsRepository")
* @ORM\Table(name="news")
* @ORM\HasLifecycleCallbacks()
*/
class News
{
/**
* @var integer
*/
private $id;
/**
* @var string
*/
private $title;
这是我的存储库类
// Foo/NewsBundle/Repository/NewsRepository.php
namespace Foo\NewsBundle\Repository;
use Doctrine\ORM\EntityRepository;
Class NewsRepository extends EntityRepository
{
public function test()
{
return "Nisarg";
}
}
我将这个来自控制器的 test()函数称为
public function indexAction()
{
// $news = $this->getDoctrine()
// ->getRepository('FooNewsBundle:News')
// ->findAll();
$em = $this->getDoctrine()
->getManager();
$news = $em->getRepository('FooNewsBundle:News')->test();
if (!$news) {
throw $this->createNotFoundException('No news found');
}
$build['news'] = $news;
return $this->render('FooNewsBundle:Default:news_show_all.html.twig', $build);
}
答案 0 :(得分:2)
检查您是否在News orm配置文件中指定了您的存储库类。
必须有类似" repositoryClass:Foo \ NewsBundle \ Repository \ NewsRepository"
别忘了清除缓存!
答案 1 :(得分:1)
我认为存储库类的标准是将它放在实体文件夹的子目录中,并仍然使用相同的实体名称空间。你使用了不同的命名空间,这就是我认为你有错误的原因。
根据食谱,这是实体和定制respistory的定义方式。 link to custom repository class in the cookbook
实体
// src/Acme/StoreBundle/Entity/Product.php
namespace Acme\StoreBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
* @ORM\Entity(repositoryClass="Acme\StoreBundle\Entity\ProductRepository")
*/
class Product
{
//...
}
存储库:
// src/Acme/StoreBundle/Entity/ProductRepository.php
namespace Acme\StoreBundle\Entity;
use Doctrine\ORM\EntityRepository;
class ProductRepository extends EntityRepository
{
public function findAllOrderedByName()
{
return $this->getEntityManager()
->createQuery(
'SELECT p FROM AcmeStoreBundle:Product p ORDER BY p.name ASC'
)
->getResult();
}
}
答案 2 :(得分:1)
Fedor Petrick是对的!
您应该查找与该实体对应的orm文件。 在我的例子中,我在OfertaBundle \ Entity文件夹中创建了一个名为:OfertaRepository.php的自定义存储库
另一方面,我有一个文件Oferta.orm.xml
在第三行,它说:
<entity name="OfertaBundle\Entity\Oferta" table="oferta">
但它应该是:
<entity name="OfertaBundle\Entity\Oferta" table="oferta" repository-class="OfertaBundle\Entity\OfertaRepository">
现在,OfertaRepository.php中的方法效果很好!
答案 3 :(得分:1)
在您的实体中,您没有使用注释,请检查Resources / config / doctrine中是否有news.yml文件
答案 4 :(得分:0)
您的代码在实体和存储库中看起来正确。也许您可以尝试直接拨打getRepository
而不使用->getManager
。
$this->getDoctrine->getRepository('FooNewsBundle:News')->test();
如果您需要特定字段,您应该查看findOneBy
和findBy
的简短符号,在大多数情况下,它更容易,而不是编写自定义类。
答案 5 :(得分:0)
你在生产吗?也许清除缓存是解决方案:
php app/console cache:clear --env=prod --no-debug
答案 6 :(得分:0)
如果清除缓存不起作用,$em->getRepository('FooNewsBundle:News') instanceOf Foo\NewsBundle\Repository\NewsRepository
是真还是假?根据事物的外观,你没有得到正确的存储库?
答案 7 :(得分:-1)
你有生成实体吗?
php app/console doctrine:generate:entities BUNDLENAME
启动此命令,然后重试代码