簡體   English   中英

實體內部的查詢生成器-主義

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM