【问题标题】:Mapping extra rows on a Doctrine 2 entity在 Doctrine 2 实体上映射额外的行
【发布时间】:2013-03-24 15:22:02
【问题描述】:

问题是,我的用户的评分是通过 MtM 关系平均得出的,例如一个User 有很多RatingsRating 实体字段值的平均值就是用户的评分。

我想做的是想办法以某种方式将这些数据放入用户模型、虚拟字段或诸如此类的东西中。我已经设法为它创建了一个非映射属性和访问器方法,这样界面就很稳固,我的视图看起来也不错。该属性显然没有在 Doctrine 中映射。

然后似乎我已经深入了解了每个 Doctrine 内部。我查看了 hydrators 和 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)...
  }
}

我很确定有一种方法可以实现 ResultSetMapping 可以做到这一点,但是如何实现呢?

【问题讨论】:

    标签: php symfony orm doctrine-orm


    【解决方案1】:

    一个丑陋的解决方法看起来像这样:

    foreach ($usersDirty as $user) {
                $user[0]->setPeopleRating($user['peopleRating']);
                $users []= $user[0];
            }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-05-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-27
      • 2018-09-19
      相关资源
      最近更新 更多