你好堆棧溢出,原則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)
方法。當然,SomeEntity
的repositoryClass
註釋的目標爲SomeEntityRepository
。相反,BaseEntityRepository
不作爲獨立存儲庫類別的目標。
的事情是,我得到的卻是一個例外:
班「模式\庫\ SomeEntityRepository」 的子類「的模式\庫\ BaseEntityRepository」是不是一個有效的實體或 映射超類。
爲了我的緣故,我不能弄清楚這段代碼有什麼問題。也許我錯過了一些東西,但是我對存儲庫中繼承的研究並沒有帶來任何令人滿意的結果。我想對存儲庫有一些限制,比如爲了正常工作,所有的東西至少應該作爲repositoryClass的目標或者類似的東西,但這並不讓我滿意。
如果您有什麼樣的見解,建議或解決方案,我全是耳朵!再次感謝。
物體掉落在領先的背部因使用\主義削減...我懷疑你的問題實際上是在你的DQL查詢。跟蹤它。 – Cerad
刪除反斜槓不會改變任何內容。但是,正如您所懷疑的那樣,問題確實來自查詢。我使用'get_called_class()'實際獲取實體名稱,但實現這種結構的方式永遠不會發生。我會以另一種方式思考,但問題確實來自DQL查詢。沒想到它可能來自於此。我是否可以請求您將您的評論更改爲答案,以便我實際選擇它作爲正確答案?非常感謝。 – Gummy