【问题标题】:How to get non-mapped column in a result of Doctrine native query如何在 Doctrine 本机查询的结果中获取非映射列
【发布时间】:2016-05-02 12:05:34
【问题描述】:

如何在本地查询的结果中获取非映射列?

我的查询:

$query = $this->getEntityManager()->createNativeQuery(
            "SELECT m.id, m.title, MATCH(m.title) AGAINST('$slug') AS score "
            . "FROM music AS m "
            . "ORDER BY score DESC LIMIT 100", $rsm);

score 列未映射到实体中,我无法从 Twig 访问其值。是否可以将此列添加到仅为该查询的实体中?

【问题讨论】:

  • 你试过了吗?它有效吗?你有错误吗?错误是什么?
  • 查询没有出错,但是当我尝试在 Twig 中显示分数时,我得到了这个: 对象 "PlayerBundle\Entity\Music" 的方法 "score" 在 src\PlayerBundle\Resources\views 中不存在\Default\search.html.twig 在第 12 行,因为分数未映射到实体类中
  • 我认为您应该确保您的数据库模型和对象模型对应。否则一切都会变得非常困难和非常错误......
  • 我在“音乐”实体中有字段“率”,我可以覆盖分数中的值,但我需要两个字段。
  • 你试过this吗?

标签: php symfony doctrine-orm nativequery doctrine-native-query


【解决方案1】:

如果您想在 Twig 模板中显示分数,您可以尝试以下步骤:

1) 将 $score 属性添加到您的 Music 实体,无需任何映射配置:

class Music {
    //Other mappings

    protected $score;

    //TODO: add getter/setter for $score
} 

2) 将其添加到您的 ResultSetMapper:

$rsm->addRootEntityFromClassMetadata('YourBundle:Music', 'm');
$rsm->addMetaResult('m', 'score', 'score', false, 'integer'); //first 'score' is your DB alias

3) 拨打您的search.html.twig:

{{ object.score }} 

object 是你的 Music 实体。

有关纯结果和混合结果的更多信息,请访问here

【讨论】:

  • $rsm->addScalarResult 有 3 个参数:ColumnName、别名、类型。我只使用 2 个参数(因为第三个是可选的)并得到结果:array:100 [▼ 0 => array:2 [▼ 0 => Music {#480 ▶} "score" => "12.595897674560547" ] 1 => array :2 [▼ 0 => Music {#561 ▶} "score" => "3.7423951625823975" ] ] 得分在 Object 之外
  • @MonkeyOne 是的,是的。我已经编辑了我的答案并对其进行了测试。显然,这是做你想做的事的唯一方法。
  • 我已经在 Music 对象中有一个“分数”,但它始终为 NULL
  • @MonkeyOne 你试过addMetaResult(你也可以试试默认的第5个参数)?
  • 我使用 $query->getArrayResult();从查询中获取结果
猜你喜欢
  • 1970-01-01
  • 2019-07-25
  • 2014-06-25
  • 2021-08-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-02
相关资源
最近更新 更多