【问题标题】:Doctrine 2 : Custom repositories and inheritance原则 2:自定义存储库和继承
【发布时间】:2014-05-21 11:13:43
【问题描述】:

你好堆栈溢出者,

使用 Doctrine 2,我在自定义存储库和继承方面遇到了一些麻烦。

长话短说,我想做那种结构:

  • BaseEntityRepository : 包含基于被调用类名的泛型方法,例如 findByXXX()
  • SomeEntityRepository : 包含与实体类型相关的具体方法

这些类的代码如下所示:

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 可以通过继承BaseEntityRepository 来访问findByID($id) 方法。当然,SomeEntityrepositoryClass 注释针对 SomeEntityRepository。相反,BaseEntityRepository 不是作为独立存储库类的目标。

问题是,我得到的只是一个例外:

Class "model\repositories\SomeEntityRepository" 的子类 “model\repositories\BaseEntityRepository”不是有效实体或 映射超类。

看在我的份上,我无法弄清楚这段代码有什么问题。也许我错过了一些东西,但我对存储库中继承的研究并没有带来任何令人满意的结果。我想对存储库有某种限制,例如为了使它们正常工作,所有这些都应该至少作为 repositoryClass 一次或类似的目标,但这并不让我满意。

如果您有任何见解、建议或解决方案,我会全力以赴!再次感谢。

【问题讨论】:

  • 从使用 \Doctrine 中删除前导反斜杠...我怀疑您的问题实际上出在您的 dql 查询中。追踪它。
  • 删除反斜杠不会改变任何东西。但是,正如您所怀疑的,问题确实来自查询。我使用get_called_class() 来实际获取实体名称,但我实现结构的方式永远不会发生。我会以另一种方式思考,但问题确实来自 DQL 查询。没想到是从那里来的。我可以要求您将您的评论更改为答案,以便我实际上可以选择它是正确的吗?非常感谢。

标签: php inheritance doctrine-orm repository customization


【解决方案1】:

问题在于 get_call_class 不会做你想做的事。

使用学说查询生成器。这样就无需知道具体的实体类。

搜索:使用 Doctrine 的查询构建器查询对象

http://symfony.com/doc/current/book/doctrine.html

【讨论】:

  • 如果有人偶然发现这篇文章,这是我使用的解决方案:我只是用$this->_entityName 替换了错误的get_called_class(),其中_entityName 可以通过Doctrine 的EntityRepository 获得,因为我的课程扩展了它.像魅力一样工作,再次感谢!
  • 很好,您可以使用它,但如果您有时间,请查看使用查询生成器。我假设您计划最终进行更高级的查询。查询生成器将为您省去很多麻烦。
猜你喜欢
  • 2012-08-16
  • 1970-01-01
  • 1970-01-01
  • 2011-09-15
  • 1970-01-01
  • 2014-06-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多