4

問題は、私のユーザーは、MtM 関係を通じて平均化された評価を持っているということです。たとえば、User多くのエンティティ フィールド値があり、エンティティ フィールド値Ratingsの平均がRatingユーザーの評価です。

私がやりたいことは、このデータをユーザー モデルや仮想フィールドなどに何らかの形で配置する方法を見つけ出すことです。マッピングされていないプロパティとそのアクセサ メソッドを作成することができたので、インターフェイスはしっかりしていて、ビューは見栄えがよくなります。プロパティは明らかに Doctrine でマップされていません。

そして、Doctrine のすべての内部を掘り下げたようです。ハイドレーターと ResultSetMappings を調べましたが、計算フィールドをエンティティ フィールドにプッシュする良い方法はないようです。

それで、ここに私が思いついたものがあります。

これは、追加フィールドに参加して選択する場所です。

$qb->select('u')
    ->addSelect('AVG(r.rating) AS people_rating')
    ->from('MyMainBundle:User', 'us')
    ->leftJoin('u.reviews', 'r', Expr\Join::WITH, 'r.user = u')
    ->where('u.id = :id')
    ->orderBy('people_rating', 'DESC')
;

私が取得する必要があるのは、何らかの方法で Doctrine をエンティティにプッシュすることpeople_ratingですUser。今、私は次のような醜い配列を取得します:

array(1) {
  [0] =>
  array(2) {
    [0] =>
    class My\MainBundle\Entity\User#868 (46) {
      protected $id =>
      int(247)
      protected $email =>
      string(28) "june68@goldneroconner.com.lc"
      private $createdAt =>
      class DateTime#973 (3) (...)
      private $firstName =>
      string(8) "John"

      (more elements)...
    }
    'people_rating' =>
    NULL
  }
}

そして、ここに私が本当に必要なものがあります:

array(1) {
  [0] =>
  class My\MainBundle\Entity\User#868 (46) {
    protected $id =>
    int(247)
    protected $email =>
    string(28) "june68@goldneroconner.com.lc"
    private $createdAt =>
    class DateTime#973 (3) (...)
    private $firstName =>
    string(8) "John"

    private $peopleRating => (...)
    (my float calculated within MySQL's AVG())

    (more elements)...
  }
}

これを行うa を実装する方法があると確信してResultSetMappingいますが、どのように?

4

1 に答える 1

0

醜い回避策は次のようになります。

foreach ($usersDirty as $user) {
            $user[0]->setPeopleRating($user['peopleRating']);
            $users []= $user[0];
        }
于 2013-04-03T06:06:05.867 に答える