教义:以键作为关联实体值的结果

Posted

技术标签:

【中文标题】教义:以键作为关联实体值的结果【英文标题】: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 查询应该是什么样的? 有没有可能达到这样的结果?

【问题讨论】:

【参考方案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)

以上是关于教义:以键作为关联实体值的结果的主要内容,如果未能解决你的问题,请参考以下文章

关联的教义 postLoad 事件

教义 resultCache 打破了实体删除

教义加入多对多没有关联

坚持时的教义关联完整性约束

教义自引用关联映射(Symfony)

将带有引用的关联数组作为值保存在教义-mongodb中