【问题标题】:Doctrine: results with keys as association entity value教义:以键作为关联实体值的结果
【发布时间】:2021-05-15 08:46:27
【问题描述】:

我的项目中有两个实体:

class Effect {

   /**
    * @ORM\Id
    * @ORM\GeneratedValue
    * @ORM\Column(name="id", type="integer")
    */
   private $id;

   /**
    * @ORM\Column(name="name", type="string", unique=true)
    */
   private $name;

   /**
    * @ORM\ManyToOne(targetEntity="App\Entity\EffectGroup", inversedBy="effects")
    * @ORM\JoinColumn(name="group_id", referencedColumnName="id")
    */
   private $effectGroup;

}

class EffectGroup {

  /**
   * @ORM\Id
   * @ORM\GeneratedValue
   * @ORM\Column(name="id", type="integer")
   */
   private $id;

   /**
    * @ORM\Column(name="name", type="string", unique=true)
    */
   private $name;

   /**
    * @ORM\OneToMany(targetEntity="App\Entity\Effect", mappedBy="effectGroup")
    */
   private $effects;

}

我需要查询数据库得到以下结果:

array [
    'effectGroupName 1' => array [
        object (App\Entity\Effect) {
            id: 1,
            name: 'effectName 1'
            ...
        },
        object (App\Entity\Effect) {
            id: 2,
            name: 'effectName 2'
            ...
        },
    ]
    'effectGroupName 2' => array [
        object (App\Entity\Effect) {
            id: 3,
            name: 'effectName 3'
            ...
        },
        object (App\Entity\Effect) {
            id: 4,
            name: 'effectName 4'
            ...
        },
    ]
]

其中effectGroupName 1effectGroupName 2 是来自EffectGroup 实体的名称。 我需要一个查询,以便我可以在 Effect id 之后过滤结果。 ORM / DQL 查询应该是什么样的? 有没有可能达到这样的结果?

【问题讨论】:

    标签: sql symfony doctrine-orm doctrine dql


    【解决方案1】:

    它不会是规范查询,因为您的结果不是。您将进行一些后处理(因为默认情况下教义返回 一个 行集)。

    存储库函数应该看起来像这样(在 EffectRepository 中)

    public function getGrouped(): array 
    {
        $result = $this->createQueryBuilder('e')
                ->innerJoin('e.effectGroup', 'g')
                ->select('e as effect') 
                ->addSelect('g.name as groupname')
                ->getQuery()
                ->getResult();
        $return = [];
        foreach ($result as $row) {
            $return[$row['groupname']][] = $row['effect'];
        }
        return $return;
    }
    

    【讨论】:

    • 我很确定您在这里不需要isset,请参阅:3v4l.org/EfGi0
    • @goulashsoup 嗯,你是对的。更新了答案。谢谢! ;o)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-01
    • 1970-01-01
    • 2018-05-21
    • 1970-01-01
    • 1970-01-01
    • 2011-05-09
    相关资源
    最近更新 更多