2016-04-27 54 views
0

我有這種情況: 實體Person,Person的存儲庫和選擇表單類型。如何在存儲庫querybuilder中調用實體的方法

我應該採取我選擇的形式只有活躍的人。

在實體中有一個公共方法「isActive」,用於檢查某個人是否有權在我的私人區域訪問。此方法返回true或false,並且不是db表中的列,它是計算的。

我需要從Person存儲庫中的querybuilder中訪問此標誌。 這可能嗎? 低於我的querybuilder在代碼庫中的代碼。

public function getQueryBuilderForEventRegistration() 
{ 
    $queryBuilder = $this->createQueryBuilder('e')->orderBy('e.surname', 'asc')->addOrderBy('e.name', 'asc'); 

    return $queryBuilder; 
} 

,並在實體的公共方法人塔TI必須訪問:

public function getIsActive() 
{ 
    if (empty($this->getUser())) 
    { 
     return false; 
    } 

    if (!$this->getUser()->isEnabled()) 
    { 
     return false; 
    } 

    /* @var $service \Siderweb\SubscriptionBundle\Entity\UserService */ 
    foreach ($this->getUser()->getServices() as $service) 
    { 
     if (!$service->getIsExpired()) 
     { 
      return true; 
     } 
    } 

    return false; 
} 

和我喜歡的類型:

$builder->add('personExist', 'entity', array(
      'class' => 'MyAppUserBundle:Person', 
      'property' => 'name', 
      'required' => false, 
      'multiple' => false, 
      'mapped' => false, 
      'empty_value' => '-- New person --', 
      'query_builder' => function(PersonRepository $repo) use ($options) { 
       return $repo->getQueryBuilderForEventRegistration(); 
      } 
     )) 

的建議修改我的資料庫是這樣的:

public function getQueryBuilderForEventRegistration(Company $company = null, Event $event = null, $emailFilter = null) 
{ 
    $queryBuilder = $this->createQueryBuilder('e')->orderBy('e.surname', 'asc')->addOrderBy('e.name', 'asc'); 

    $people = $queryBuilder->getQuery()->execute(); 
    $peopleToShow = array(); 

    foreach ($people as $person) 
    { 
     if ($person->getIsActive()) 
     { 
      array_push($peopleToShow, $person); 
     } 
    } 

    return $peopleToShow; 
} 

但現在我沒有k現在如何把這個數組放在我的typeForm中。任何想法?

+0

我不知道它是否可行,但是你可以在你的控制器中做到這一點,並將參數添加到你的函數中:getQueryBuilderForEventRegistration($ param)並按照你的要求做你想要的參數 – Letsrocks

+0

你的自定義函數有多複雜? – goto

回答

0

好的,所以你不能在查詢生成器上調用實體方法,但你可以在查詢結果上。 Doctrine將使用從數據庫返回的數據來保存實體對象。

一旦你有你的結果,你可以調用水合實體上的isActive()方法。

,你想實現這個(獲得窗體的查詢生成器)的方式,你會在你的數據庫表中需要一個isActive列,並添加「其中」條款,像這樣:

public function getQueryBuilderForEventRegistration() 
{ 
    $queryBuilder = $this->createQueryBuilder('e') 
     ->where('e.isActive', true) 
     ->orderBy('e.surname', 'asc') 
     ->addOrderBy('e.name', 'asc'); 

    return $queryBuilder; 
} 
+0

感謝您的回答, 但是,一旦我從我的查詢生成器得到結果我怎麼能在類型生成器中調用結果過濾的數組? –

+0

在表單中,除了構建所需的查詢之外,您無法對結果進行任何操作。一旦你有你的querybuilder對象,你可以調用$ queryBuilder-> getResult(),它將返回一個對象數組返回。然後,您可以遍歷它們並在該對象上調用 - > isActive()方法。 – LMS94

+0

但是,如果我的QueryBuilder返回給我一個數組,我怎麼能把它放到我的typeform結構中? –

0

不可能將自定義PHP方法稱爲SQL查詢,所以Doctrine的QueryBuilder不允許這樣做。您需要將isActive作爲數據庫字段(或自定義方法),或者使用QueryBuilder條件再現getIsActive方法。

相關問題