草庐IT

php - 在 Doctrine 2 实体上映射额外的行

coder 2024-04-21 原文

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

我想做的是找出一种方法,以某种方式将这些数据放入用户模型、虚拟字段或诸如此类的东西中。我设法为它创建了一个非映射属性和访问器方法,这样界面就很牢固,我的 View 看起来也不错。该属性显然没有映射到 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 来执行此操作,但是如何实现呢?

最佳答案

一个丑陋的解决方法是这样的:

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

关于php - 在 Doctrine 2 实体上映射额外的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15779238/

有关php - 在 Doctrine 2 实体上映射额外的行的更多相关文章

  1. ruby-on-rails - Ruby 中意外的大小写行为 - 2

    我在一段非常简单的代码(如我所想)中得到了一个错误的值:org=4caseorgwhenorg=4val='H'endputsval=>nil请不要生气,我希望我错过了一些非常明显的东西,但我真的想不通。谢谢。 最佳答案 这是典型的Ruby错误。case有两种被调用的方法,一种是你传递一个东西作为分支的基础,另一种是你不传递的东西。如果您确实在case中指定了一个表达式语句然后评估所有其他条件并与===进行比较.在这种情况下org评估为false和org===false显然不是真的。所有其他情况也是如此,它们要么是真的,要么是假的。

  2. ruby - 在 Ruby 中跳过额外的关键字参数 - 2

    我定义了一个方法:defmethod(one:1,two:2)[one,two]end当我这样调用它时:methodone:'one',three:'three'我得到:ArgumentError:unknownkeyword:three我不想从散列中一个一个地提取所需的键或排除额外的键。除了像这样定义方法之外,有没有办法规避这种行为:defmethod(one:1,two:2,**other)[one,two,other]end 最佳答案 如果不想写**other中的other,可以省略。defmethod(one:1,two:2

  3. ruby-on-rails - 这个 C 和 PHP 程序员如何学习 Ruby 和 Rails? - 2

    按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭9年前。我来自C、php和bash背景,很容易学习,因为它们都有相同的C结构,我可以将其与我已经知道的联系起来。然后2年前我学了Python并且学得很好,Python对我来说比Ruby更容易学。然后从去年开始,我一直在尝试学习Ruby,然后是Rails,我承认,直到现在我还是学不会,讽刺的是那些打着简单易学的烙印,但是对于我这样一个老练的程序员来说,我只是无法将它

  4. ruby-on-rails - 如何添加具有额外列的多对多记录 - 2

    我有以下模型用户has_many:users_contactshas_many:contacts,through::users_contactsaccepts_nested_attributes_for:contacts,allow_destroy:true联系方式has_many:users_contactshas_many:users,through::users_contactsaccepts_nested_attributes_for:users_contacts,allow_destroy:true用户联系belongs_to:usersbelongs_to:contacts

  5. ruby-on-rails - 带有自定义 rails 表单生成器的额外字段 - 2

    我有一个自定义表单生成器,使用此自定义生成器的原因之一是对于每个表单,我都需要包含一些额外的参数,我不想在每个表单中使用隐藏字段标签显式放入这些参数写。for_for(@foo,:builder=>MyBuilder)do|f|#stuffIshouldn'thavetoworryabout#thisshouldbeputinallthetimewithoutmehavingtodoithidden_field_tag('extra','myextrainfo')#normalthingsIwouldputinf.text_field(:bar)end我必须在我的自定义表单构建器中做什

  6. ruby-on-rails - If 语句中额外的 Ruby 行会导致 Haml 出现问题吗? - 2

    我试图在我的一个HamlView中的If/Else语句中放置一些(未呈现的)注释,但它似乎会导致问题。我想要以下代码:-#Stufflike______activatestheifstatement-if@condition(Somecode)-#Stufflike_____activatestheelsestatement-else(Someothercode)不幸的是,Rails向我抛出这个错误:Got"else"withnopreceding"if"如果我删除“其他”注释,即-#Stufflike______activatestheifstatement-if@condition

  7. ruby-on-rails - 如果字段不为零,则葡萄实体有条件地公开 - 2

    在一个葡萄实体中,我只想在没有运气的情况下显示一个字段(不是零?)。我正在尝试这段代码,但根本没有按预期工作,但总是隐藏该字段。expose:winner,:using=>PlayerEntity,:unless=>{:winner=>nil}我认为代码本身解释了我真正需要的东西,但正如我所说,我没有得到预期的结果。有什么线索吗? 最佳答案 好的,检查grape-entity的代码我发现你需要将这个block作为RubyProc传递。此代码将按预期工作:expose:winner,:using=>PlayerEntity,:unle

  8. ruby - 如何从定义相同名称的模块内部访问ruby中的顶级实体 - 2

    在一个模块中,我有一个名为Process的类。moduleMProcess=Class.newProcess::wait(0)end这会引发NoMethodError。如何从模块内部访问顶级Process?如果不重命名我的类(class),这完全有可能吗? 最佳答案 ::Process.wait(0) 关于ruby-如何从定义相同名称的模块内部访问ruby中的顶级实体,我们在StackOverflow上找到一个类似的问题: https://stackoverf

  9. ruby - 访问类外的常量 - 2

    当我想访问类Test中的常量CONST时classTestCONST=7end在课外,我必须这样做:putsTest::CONST为什么在执行此操作时会出现错误?putsobj::CONST如果obj是Test类的一个对象,为什么我尝试通过该对象访问常量时会出错? 最佳答案 因为实例对象和类对象不是一回事。命名空间存在于类对象上,不存在于实例上。但是,您可以向实例询问它的类,然后深入研究它。putsobj.class::CONST 关于ruby-访问类外的常量,我们在StackOverf

  10. ruby-on-rails - Rails 还是 Sinatra? PHP程序员入门学习哪个好? - 2

    按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭10年前。我使用PHP的时间太长了,对它感到厌倦了。我也想学习一门新语言。我一直在使用Ruby并且喜欢它。我必须在Rails和Sinatra之间做出选择,那么您会推荐哪一个?Sinatra真的不能用来构建复杂的应用程序,它只能用于简单的应用程序吗?

随机推荐