2017-05-22 10 views
1

リポジトリにコードを書く方法を探しています。このようなシナリオに遭遇したことを願っています。エンティティ輸送エンティティの結果があります。symfonyのエンティティ内部のエンティティをフィルタリングする方法

- id 
    - user 
    - id 
    - name 
    - address 
    - emails[] 
    1-{ 
     email, 
     date 
    } 
    2-{ 
     email, 
     date 
    } 
    3-{ 
     email, 
     date 
    } 

しかし、私は配列の最後のメールを必要とし、これは私がここに私のリポジトリを持っている私のAPIで、私は必要な表示

- id 
- user 
    - id 
    - name 
    - address 
- emails[] 
    3-{ 
     email, 
     date 
    } 

あり、これは、交通機関のリストが、電子メールを表示します。最後のメールにフィルタリングされません。

/** 
* display transportation list 
*/ 
public function findById($id){ 

     return $this->createQueryBuilder('t') 
      ->leftJoin('t.emails', 'e') 
      ->where('t.id = :id') 
      ->setParameter(':id', $id) 
      ->getQuery() 
      ->getResult()[0]; 

} 

私はCriteriaが有用である場合はDESCに電子メールをフィルタリングすることにより、この部分に知っていて、最後の部分を得ることはありません。しかし、あなたはこれを行う方法についての提案がある場合。私はそれを勉強することがうれしいです。私はこれを修正する方法について考えていません。私はすでに私の輸送エンティティにlast()関数を置いていました。私の上司は、その機能を私の輸送レポジトリに追加したいと考えています。さて、私はこれを修正する方法を探しています。

+0

プロジェクトで 'LexikFormFilterBundle'を使うことをお勧めします。 –

答えて

2

エンティティ内では、フィールド$emailsDoctrine\Common\Collections\Collectionのインスタンスです。このインタフェースには、コレクション内の要素を見つけるのに役立つ便利なメソッドが多数含まれています。このメソッドの1つはlast()で、これはコレクション内の最後のエンティティを返します。

あなたはあなたの最後のメールを与えるあなたのエンティティにパブリックメソッドを追加することができます。

public function getLastEmail() 
{ 
    return $this->emails->last(); 
} 

電子メールがIDでソートされますが、あなたがに@ORM\OrderBy({"id"="ASC"})注釈を追加することで、これを強制することが保証いません$emailsフィールド(またはマッピングにYAMLファイルを使用する場合は、YAMLの類似の設定)。

+0

私はそれをしましたが、私の上司は運送事業者ではなく私の運送倉庫にそれを追加したいと考えています。私はそれをどうやってするかについては考えていません。いくつかのコードはあなたと同じことをしています – user3818576

+0

'JOIN'を内部選択、' JOIN(SELECT MAX(id)FROM電子メールGROUP BY transportation_id'のようなもの)で 'JOIN'を使うカスタムクエリを書く必要があります。上司の懸念が最適化されている場合、彼は[3最適化のルール](http://wiki.c2.com/?RulesOfOptimization)について学ぶべきでしょう。 –

+0

私はそれをチェックします。そのコードを最初に検索してください。 – user3818576

関連する問題