Symfony queryBuilder:查询过多

the_nuts

我有一个与User表具有ManyToMany关系的实体:

/**
 * @ORM\ManyToMany(targetEntity="User")
 * @ORM\JoinTable(
 *  name="offer_allowedusers",
 *  joinColumns={
 *      @ORM\JoinColumn(name="offer_id", referencedColumnName="id", onDelete="CASCADE")
 *  },
 *  inverseJoinColumns={
 *      @ORM\JoinColumn(name="user_id", referencedColumnName="id", onDelete="CASCADE")
 *  }
 * )
 */
private $allowedUsers;

而且,在表单中,我想显示一个下拉列表(使用select2)以选择允许哪些用户:

在此处输入图片说明

为此,我在Form大楼中进行了以下操作:

->add('allowedUsers', EntityType::class, [
        'class' => 'AppBundle\Entity\User',
        'query_builder' => function (EntityRepository $er) {
            return $er->createQueryBuilder('u')
            ->orderBy('u.username', 'ASC');
        },
        'label' => 'Allowed users',
        'required' => false,
        'multiple' => true
    ])

问题是它会查询每个用户,以获取用户名...因此,如果我有500个用户,则会进行500个查询...

在此处输入图片说明

如何优化并执行单个查询以获取所有记录?

杰森·罗曼(Jason Roman)

在您的QueryBuilder中显式创建联接,然后选择用户和允许的用户。

更新

您还必须加入并选择用户配置文件和用户设置OneToOne关系,因为在每次获取User实体时,Doctrine都会自动检索它们的OneToOne关系。

大约主义文档会谈为什么它取一个一对一关系的另一方时执行额外的查询。

->add('allowedUsers', EntityType::class, [
    'class' => 'AppBundle\Entity\User',
    'query_builder' => function (EntityRepository $er) {
        return $er->createQueryBuilder('u')
            ->select('u, au, up, us')
            ->join('u.allowedUsers', 'au')
            ->join('u.userProfile', 'up')
            ->join('u.userSettings', 'us')
            ->orderBy('u.username', 'ASC')
        ;
    },
    'label' => 'Allowed users',
    'required' => false,
    'multiple' => true
])

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章