[英]Query Builder inside entity - Doctrine
我正在尋找一種更好的方法來編寫此功能。 它在一個學說實體模型中
public function getCompanySubscriptions()
{
foreach ($this->subscriptions as $key => $value) {
if ($value->getPlan()->getType() == 'E' && $value->getActive()) {
return $value;
}
}
return null;
}
$this->subscriptions
是多對一的集合,可以具有不同的“類型”(但其中只有一個類型為“ E”)。
問題是:如果Company
$subscriptions
過多,則此函數將太慢而無法返回只有TW類型的視圖需要我檢查的“ E”類型之一。 解決方案是使用QueryBuilder
,但是我還沒有找到直接從實體模型中使用它的方法。
您不能在實體內部使用QueryBuilder
,而是可以使用准則Criteria
來過濾集合(在SQL級別上)。 檢查文檔章節8.8。 篩選集合以獲取有關Criteria
更多詳細信息 。
如果尚未從數據庫中加載集合,則過濾API可以在SQL級別上工作,以對大型集合進行優化訪問。
例如,僅獲取活動訂閱:
$subscriptions = $this->getCompanySubscriptions();
$criteria = Criteria::create()
->where(Criteria::expr()->eq("active", true));
$subscriptions = $subscriptions ->matching($criteria);
這樣,您可以解決性能問題,因為直接使用Criteria
的條件從數據庫中加載了集合。
您所遇到的問題可能是您需要加入Plan
,但是在Criteria
無法加入 。 因此,如果確實需要加入,則應考慮使用自定義查詢,在其中使用公司EntityRepository
條件(例如,使用QueryBuilder
)進行加入。
注意。 可以使用ArrayCollection
類中的filter
方法重寫問題中的foreach
。 過濾器接受一個謂詞,所有滿足該謂詞的元素將被返回。 另請參閱教義2類文檔中的此處,以獲取更多信息。
您的謂詞看起來像:
$predicate = function($subscription){
$subscription->getPlan()->getType() == 'E' && $subscription->getActive();
}
接着:
return $this->subscriptions->filter($predicate);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.