Hello Stack Overflowers,
使用Doctrine 2,我遇到了一些关于自定义存储库和继承的麻烦。
长话短说,我想制作那种结构:
这些类的代码如下所示:
BaseEntityRepository:
namespace model\repositories;
use \Doctrine\ORM\EntityRepository;
class BaseEntityRepository extends EntityRepository {
public function findByID($id) {
$result = null;
try {
$dql = "SELECT a FROM " . get_called_class() . " a WHERE a.id = :id";
$query = $this->_em->createQuery($dql);
$query->setParameter("id", $id);
$result = $query->getSingleResult();
} catch (\Exception $ex) {
echo $ex->getMessage();
}
return $result;
}
}
SomeEntityRepository:
namespace model\repositories;
class SomeEntityRepository extends BaseEntityRepository {
}
我的测试示例代码:
$repo = $em->getRepository("model\\entities\\SomeEntity");
$result = $repo->findByID($id);
使用此代码,我希望$repo
可以通过继承findByID($id)
来访问BaseEntityRepository
方法。当然,repositoryClass
目标的SomeEntity
注释SomeEntityRepository
。相反,BaseEntityRepository
不是作为独立的存储库类的目标。
问题是,我得到的只是一个例外:
Class" model \ repositories \ SomeEntityRepository"子类 "模型\库\ BaseEntityRepository"不是有效的实体或 映射超类。
我不能为了我而弄清楚这段代码中的错误。也许我错过了一些东西,但我对存储库中继承的研究没有带来任何令人满意的结果。我想对存储库有一些限制,例如为了让它们正常工作,所有应该至少作为repositoryClass一次或类似的目标,但这并不让我高兴。
如果你有任何见解,建议或解决方案,我全都耳朵!再次感谢。
答案 0 :(得分:1)
问题在于get_called_class,它不会做你想要的。
使用doctrine查询构建器。这消除了了解特定实体类的需要。
搜索:使用Doctrine的查询生成器查询对象