2014-05-21 63 views
1

你好堆棧溢出,原則2:自定義存儲庫和繼承

使用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不作爲獨立存儲庫類別的目標。

的事情是,我得到的卻是一個例外:

班「模式\庫\ SomeEntityRepository」 的子類「的模式\庫\ BaseEntityRepository」是不是一個有效的實體或 映射超類。

爲了我的緣故,我不能弄清楚這段代碼有什麼問題。也許我錯過了一些東西,但是我對存儲庫中繼承的研究並沒有帶來任何令人滿意的結果。我想對存儲庫有一些限制,比如爲了正常工作,所有的東西至少應該作爲repositoryClass的目標或者類似的東西,但這並不讓我滿意。

如果您有什麼樣的見解,建議或解決方案,我全是耳朵!再次感謝。

+0

物體掉落在領先的背部因使用\主義削減...我懷疑你的問題實際上是在你的DQL查詢。跟蹤它。 – Cerad

+0

刪除反斜槓不會改變任何內容。但是,正如您所懷疑的那樣,問題確實來自查詢。我使用'get_called_class()'實際獲取實體名稱,但實現這種結構的方式永遠不會發生。我會以另一種方式思考,但問題確實來自DQL查詢。沒想到它可能來自於此。我是否可以請求您將您的評論更改爲答案,以便我實際選擇它作爲正確答案?非常感謝。 – Gummy

回答

1

問題在於get_called_class不會做你想做的事情。

使用原則查詢生成器。這消除了瞭解特定實體類的需求。

搜索:查詢使用Doctrine的查詢生成器

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

+0

非常感謝!選擇正確。 – Gummy

+0

如果有人絆倒這篇文章,這裏是我使用的解決方案: 我簡單地用'$ this - > _ entityName'替換錯誤的'get_called_class()',其中'_entityName'通過Doctrine的EntityRepository可用,因爲我的類繼承它。像魅力一樣工作,再次感謝! – Gummy

+0

很好,你有它的工作,但看看使用查詢生成器,當你有時間。我假設你計劃最終有更高級的查詢。查詢生成器將爲您節省很多麻煩。 – Cerad