forms - 如何在表单中仅加载 OneToMany 关联的子集?

标签 forms symfony doctrine-orm

我有两个实体:ABA 通过 OneToMany 关联与 B 关联:

class A
{
    // ...
    /**
     * @ORM\OneToMany(targetEntity="..\AcmeBundle\Entity\B", mappedBy="A", fetch="EXTRA_LAZY")
     */
    private $things;

    public function __construct()
    {
        $this->things = new ArrayCollection();
    }

    // ...
    // addThing(), removeThing() and getThings() are properly defined

我有一个用于 A 实体的 Form 类:

class AThingsType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('things', 'collection', array(
                'type' => new BType()
            ))
            ->add('send', 'submit')
        ;
    }

    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => '..\AcmeBundle\Entity\A'
        ));
    }

    public function getName()
    {
        return 'a_things';
    }
}

BType 类包含定义 B 形式的字段,其中没有什么特别的。

我从我的 Controller 使用这个表单:

$a = $em->getRepository('AcmeBundle:A')->getAWithSubsetOnly($A_id);

$form = $this->createForm(new AThingsType (), $a /* instance of A*/);

然后表单将在 Twig 模板中呈现。

它将为 A->things 中的每个元素添加一个 BType,但我只想显示 A->strings 的子集,因为当前用户没有权限修改所有A->things,他只能更新其中的部分B > 实体。我不知道如何做到这一点,因为 A->things 的整个集合会自动加载(即使 a 执行 ->innerJoin() 仅获取事物的子集),因此表单显示所有 BType 而我只想显示其中的一些(基于 SQL 查询)。

现在通过调用{% do form.contenu.setRendered %}隐藏字段在 Twig 但我希望可能有更好的解决方案。

最佳答案

问题可能是您没有在 getAWithSubsetOnly 存储库方法的 DQL/QueryBuilder 调用中显式选择所需的实体。

例如,这将获取一个用户,如果我想在表单中将其所有日志显示为集合,则无论我的条件如何,都会延迟加载所有日志:

$userData = $this->getEntityManager()
    ->createQueryBuilder()->select('u') // constraint ignored
    ->from('SomeUserBundle:User', 'u')
    ->join('u.logs', 'l')
    ->where('l.id < 20880')
    ->andWhere('u.id = 7')
    ->getQuery()->getSingleResult();

如果您明确告诉原则在连接处获取子实体,如下所示,它不会延迟加载集合并且您将获得过滤后的集合子集:

$userData = $this->getEntityManager()
    ->createQueryBuilder()->select('u, l') // constraint taken into account as
                                           // logs not lazy loaded
    ->from('SomeUserBundle:User', 'u')
    ->join('u.logs', 'l')
    ->where('l.id < 20880')
    ->andWhere('u.id = 7')
    ->getQuery()->getSingleResult();

通过这种方法,您还可以节省大量延迟加载 SQL 查询。

关于forms - 如何在表单中仅加载 OneToMany 关联的子集?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27290767/

相关文章:

forms - Angular2动态添加/删除表单字段

javascript - 插入字段的 Tabindex

javascript - Bootstrap 表单不是响应式/可折叠的

javascript - 使用 symfony2 和 jquery 的模态表单未与数据一起提交

使用 Doctrine DataFixtures 时的 Symfony HttpFoundation UploadedFile "not uploaded due to unknown error"

javascript - 使用 jQuery 检查输入元素的焦点失败

symfony - 使用连接表更新学说

symfony - 访问 Twig 中的集合字段

php - Zend Db(标准或表格网关)与 Zend 2 中的 Doctrine - 优点/缺点

php - Symfony3 Doctrine 使用时区