2

想象三个实体 - 帐户、地址、购买。Account 与 Address 具有 OneToMany 关系。购买与帐户相关,但与地址无关- 但它确实有一个地址文本字段(这是因为地址可以更改,我不希望地址直接相关)。在用户的帐户页面上,他们可以添加地址。登录到站点时,会在会话中存储购买 ID,并在需要时用于检索购买详细信息。

我想要在结帐页面上做的是在 <select> 中显示用户当前拥有的所有地址的列表,允许他们选择一个,并更新当前购买中的地址。$account->getAddresses() 存在并将显示与用户相关的地址。

我已阅读http://symfony.com/doc/current/reference/forms/types/collection.htmlhttp://symfony.com/doc/current/cookbook/form/form_collections.html并且看不到如何将其应用于这种情况,尽管嵌入式表单并不是真正必要的 - 我不想在那个阶段更改购买的其他细节。

所以我的问题是(至少一个):如何将 $account->getAddresses() 的结果传递给表单类型?或者在表单类型中,我应该使用实体字段类型,如果是,我如何让自定义 query_builder 包含表单类型中的当前用户?或者我应该怎么做?

4

1 回答 1

3

您需要将实体传递给类型的构造函数,然后使用它来获取参数。

Class YourType extends AbstractType
{
    private $account;

    public function __construct($account)
    {
        $this->account = $account;
    }

    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $accountId = $account->getAccountId();

        $builder->add('addressId', 
                      'entity', 
                       array('class' => 'YourBundle:Address',
                             'query_builder' => function(EntityRepository $er) use ($accountId) {
                                                   return $er->createQueryBuilder('a')
                                                             ->where('a.accountId = ?1')
                                                             ->setParameter(1, $accountId)));
     }
}
于 2013-09-19T04:25:53.893 回答