問題は、私のユーザーは、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
いますが、どのように?