Php Symfony 2.7表单生成器是否具有来自其他实体的新字段?

Php Symfony 2.7表单生成器是否具有来自其他实体的新字段?,php,symfony,doctrine-orm,doctrine,Php,Symfony,Doctrine Orm,Doctrine,因此,我从数据库布局开始,我有一个User表,它有一个accounts\u id链接到另一个表accounts 在账户内部我有公司名称。现在我已经为我的用户注册建立了一个AbstractType。我希望此表单包含companyname的字段。但我所做的一切都不起作用,那么到目前为止我所做的是什么呢 use XBundle\Form\AccountType; class UserType extends AbstractType { public function buildForm(Fo

因此,我从数据库布局开始,我有一个
User
表,它有一个
accounts\u id
链接到另一个表
accounts

账户内部
我有
公司名称
。现在我已经为我的用户注册建立了一个AbstractType。我希望此表单包含
companyname
的字段。但我所做的一切都不起作用,那么到目前为止我所做的是什么呢

use XBundle\Form\AccountType;

class UserType extends AbstractType {

  public function buildForm(FormBuilderInterface $builder, array $options) {

    $builder->add('firstname', 'text',['label'=>'Firstname'])
            ->add('surname', 'text',['label'=>'Surname'])

            //->add('companyname','text', ['data_class' => 'XBundle\Entity\Accounts'])

            ->add('companyname', new AccountType()) <- current attempt

            ->add('email', 'email',['label'=>'Email'])
            ->add('password', 'password',['label'=>'Password']);

            //->add('confirm', 'password', ['mapped' => false,'label'=>'Re-type password'])
            //->add('homepage', 'text',['label'=>'Homepage'])

            //->add('save', 'submit', ['label'=>'Register']);
  }

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

  public function configureOptions(OptionsResolver $resolver) {
    $resolver->setDefaults([
        'data_class' => 'XBundle\Entity\Users',
        'cascade_validation' => true,
    ]);
  }
}
当我为我的小树枝构建一个
createForm&createView
时(没有
companyname/AccountType
,它的渲染没有任何问题)。我得到以下错误

Neither the property "companyname" 
nor one of the methods "getCompanyname()", 
"companyname()", "isCompanyname()", "hasCompanyname()", 
"__get()" exist and have public access in class "XBundle\Entity\Users"
现在我知道
companyname
在我的
账户实体中。我还做了一个测试,以确保我的
AccountType
能够正常工作,方法是使用该类型构建一个新表单,从而使
Company Name
字段没有任何问题


但是我不确定我做错了什么,或者即使这是在我的用户注册表单上添加另一个实体字段的正确方法,请帮助:)

您可能会遇到错误

AccountType
是编辑
Account
实体详细信息的表单。通过将
companyname
添加到构建器中,可以明确地说该属性存在setter和getter。A这部分是正确的

UserType
是编辑
用户
实体详细信息的表单,而不是编辑
账户
详细信息的表单。如果添加名为
companyname
AccountType
属性,表单组件希望您提供以下方法:

public function getCompanyname() {/*...*/}
public function setCompanyname(Account $account) {/*...*/}
这不是你所期望的,也正是错误所说的

您需要向您的用户实体提供
帐户的访问者,然后定义表单应该如何处理它

选项1:您想选择一个现有帐户 将其添加到
UserType
builder:

public function buildForm(FormBuilderInterface $builder, array $options) {
    // options are guessed anyway, you choose if set it explicitly or not
    $builder->add('account'/*, 'entity', array(
        'class' => 'XBundle:Account'
    )*/);
}
public function buildForm(FormBuilderInterface $builder, array $options) {
    $builder->add('account', new AccountType());
}
并将以下内容发送给您的
用户
实体:

class User {
    private $account;

    public function getAccount() {
        return $this->account;
    }

    public function setAccount(Account $account /* = null, if optional */) {
        $this->account = $account;
    }
}
class User {
    private $account;

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

    public function getAccount() {
        return $this->account;
    }
}
选项2:您需要一对一的关联和可编辑的帐户 将其添加到
UserType
builder:

public function buildForm(FormBuilderInterface $builder, array $options) {
    // options are guessed anyway, you choose if set it explicitly or not
    $builder->add('account'/*, 'entity', array(
        'class' => 'XBundle:Account'
    )*/);
}
public function buildForm(FormBuilderInterface $builder, array $options) {
    $builder->add('account', new AccountType());
}
并将以下内容发送给您的
用户
实体:

class User {
    private $account;

    public function getAccount() {
        return $this->account;
    }

    public function setAccount(Account $account /* = null, if optional */) {
        $this->account = $account;
    }
}
class User {
    private $account;

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

    public function getAccount() {
        return $this->account;
    }
}

好的,我已经做到了。但这只会给我一个空的下拉列表?我需要它是一个文本输入,以保存帐户实体内的公司名称字段。-对不起,我一定是做错了什么。。。。对Symfony来说,这是非常新鲜的!您将得到一个空列表,因为
实体
类型是关于从数据库中选择现有实体。要编辑实体,需要使用
AccountType
并确保
Account
属性始终在用户类中初始化。请注意,通过这样做,您在用户和帐户之间建立了强大的一对一关联。谢谢,但我不理解这一点-网站上的文档对我帮助不大。我不想要一对一的。很多用户都有一个帐户,所以(除非我错了)我想要一个多人关系。我来自于使用CakePHP,这对于蛋糕来说非常容易。但我想这可能有点超出我的理解。。。。。谢谢你的帮助,我已经用你的选项2设置好了-看起来很有效。如果我需要在一个新问题中问这个问题,我会的。但是我怎样才能在一次点击中保存这些数据呢。如果我使用表单数据“持久化”用户,它会尝试将NULL添加到用户内的Account_id字段,因此不保存Account/company names字段……如果知道如何保存,在Symfony中也很容易:)如果要保存新实体或选择现有实体,则会变得更复杂。例如,您可以设置两个字段:默认字段用于选择类型(选项1),未映射字段用于创建新帐户。然后,控制器或表单侦听器应该选择两者中哪个更重要。例如,见。对于“null”值的问题,需要在条令关联定义上设置cascade persist。