2016-04-27 6 views
0

私はこのシナリオを持っています: エンティティPerson、Personのリポジトリ、および選択フォームタイプ。リポジトリクエリビルダのエンティティのメソッドを呼び出す方法

私は自分の選択したフォームをアクティブな人だけに入れてください。

エンティティには、個人が自分のプライベートエリアでアクセスする権限を持っているかどうかをチェックするパブリックメソッドisActiveがあります。このメソッドは、真または偽を返し、dbテーブルの列ではなく、計算されます。

Personリポジトリのquerybuilderからこのフラグにアクセスする必要があります。 可能ですか?リポジトリ内のmy querybuilderのコードの下に があります。

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

    return $queryBuilder; 
} 

と実体人の股関節のTIにおけるパブリックメソッドにアクセスする必要があります:私はこのように私のリポジトリを編集示唆したよう

$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 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; 
} 

と私のタイプ

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)とparamで何をしたいのですか? – Letsrocks

+0

カスタム関数はどれくらい複雑ですか? – goto

答えて

0

クエリビルダでエンティティメソッドを呼び出すことはできませんが、クエリ結果ではできます。 Doctrineはデータベースから返されたデータでエンティティオブジェクトを水和します。

結果が得られたら、水和したエンティティでisActive()メソッドを呼び出すことができます。

あなたは(フォームのクエリビルダを取得)これを実装しようとしている方法は、あなたのデータベーステーブルののisActive列が必要になりますので、LIKE「どこ」節を追加

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が配列を返すと、どうすればそれを私の型form構造体に入れることができますか? –

0

カスタムPHPメソッドをSQLクエリと呼ぶことはできません。そのため、DoctrineのQueryBuilderはSQLクエリを許可しません。 isActiveをデータベースフィールド(またはカスタムメソッド)として使用するか、getIsActiveメソッドをQueryBuilderの条件で再現する必要があります。

関連する問題