我有两个实体:A
和 B
。 A
通过 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/