2017-09-21 4 views
0

私は profilestatussymfony2リポジトリで複数のテーブル接続を作成するには?エンティティ?

Profile.class

id name 
1 taro 
2 jiro 
3 john 

Status.class

id profile school   date 
1 1  highschool  2017-04-01 
2 1  juniorhighschool 2013-04-01 
3 2  highschool  2017-04-01 

ステータスがときステータス変更追加されるようなテーブルを持っています。

私は通常、ステータスが必要なときは常に最新のステータスを選択します。

$ss = $this->em->createQuery(
    "SELECT cm FROM UserBundle:Status s where c.profile = :p order by desc")     
       ->setParameters(['p' => $profile])->getResult(); 
$ss[0] // Latest Status 

ここで、これを機能させたいと思います。

私がしたいのは、プロフィールから最新のステータスを取得することです。

私はいくつかのアイデア

  • プロフィールエンティティにこの機能を入れていますか?
  • この機能をプロファイルリポジトリに配置しますか?
  • この機能を使用しますか?

私の意見では、プロファイルエンティティの機能である必要があります。エンティティに入れたいのですが、エンティティから別のものにアクセスするのは悪い方法です。

プロファイルリポジトリから別のエンティティにアクセスできますか?

サービスを使うべきですか?

+0

ステータスエンティティを返すためにプロファイルリポジトリに完全に受け入れられます。 – Cerad

答えて

0

あなたはProfileRepository

<?php 

public function getLastStatusByProfile(Profile $profile) 
{ 
    // do our query from Profile with a join on Status 
} 

における方法でこれを達成することができますそして、あなたのクエリにLIMIT 1を使用してください、あなただけのあなたは、エンティティのエンティティので、これを置くことができない

0

最後の結果を必要としますDoctrine EntityManager依存性($this->em)を注入できません。 getLatestStatus()関数を実行するには、EntityManager $this->emが必要です。

  • は、依存性注入の設定を使用してサービスに注入(コントローラ$this->get('doctrine')->getManager();に例えば)コマンドまたはコントローラ内のコンテナからそれを得る:

    あなたができるのEntityManagerにアクセスするにはファイル(http://symfony.com/doc/current/service_container.html#injecting-services-config-into-a-serviceを参照)

  • リポジトリにネイティブアクセスがあるため、リポジトリで使用

通常、人々はgetLatestStatus()のような関数をリポジトリに入れます。リポジトリは「すべてのDQLクエリを置くクラス」になり、これはかなりうまく動作します。これは、公式のドキュメント(https://symfony.com/doc/current/doctrine/repository.html)で推奨されています "クエリロジックを含むメソッドは、このクラスに格納することができます。

それは持ってsymfonyアプリケーションでは普通である:

  • エンティティプロパティのみ、ゲッター、セッター、およびいくつかのadditionnal論理関数(のようなactivate()disable() ...エンティティのプロパティを変更する機能)を有する

  • リポジトリは、REA他の任意の他の機能を保持するために複雑なロジックなどgetLatestStatus()

  • サービスとDQLクエリを保持します

    <?php 
    
    class ProfileRepository extends EntityRepository 
    { 
        /** 
        * @param Profile $profile 
        * 
        * @return Status 
        */ 
        public function getLatestStatus($profile) 
        { 
         $qb = $this->getEntityManager()->createQuery(
         "SELECT cm FROM UserBundle:Status s where c.profile = :p order by desc")     
           ->setParameters(['p' => $profile]) 
           ->getResult(); 
    
         return $result; 
        } 
    } 
    

    そして「ノーがあるケースを処理することを忘れないでください:D /データを修正

  • コントローラは、だから、一つの完全な例は以下のようになりサービス

を使用する唯一のゲートウェイですこのプロファイルで利用可能な「ステータス」。 nullを返すか、例外を発生するか、デフォルトのstatusを返しますか?

関連する問題