Php Symfony 2-具有一个表单的多个实体

Php Symfony 2-具有一个表单的多个实体,php,mysql,forms,symfony,doctrine-orm,Php,Mysql,Forms,Symfony,Doctrine Orm,我得到了以下关系表: UserAddress表保存地址的基本信息 UserAddressFields表保存与地址关联的每个字段的值 UserAddressFieldsTranslation表保存字段ID UserStates表包含美国所有州的值和缩写 UserAddress有2个外键: Profile\u id->useraccounts.id state\u id->userstates.id UserAddressFields有一个外键: 地址\u id->useraddress.id 我已

我得到了以下关系表:

UserAddress表保存地址的基本信息 UserAddressFields表保存与地址关联的每个字段的值 UserAddressFieldsTranslation表保存字段ID UserStates表包含美国所有州的值和缩写 UserAddress有2个外键:

Profile\u id->useraccounts.id state\u id->userstates.id UserAddressFields有一个外键:

地址\u id->useraddress.id 我已经为所有4个表创建了实体。为了节省空间,通过控制台生成了getter和setter:

UserAddress.php

<?php
namespace SCWDesignsBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use SCWDesignsBundle\Entity\UserStates;
use UsersBundle\Entity\User;

/**
 * @ORM\Entity(repositoryClass="SCWDesignsBundle\Entity\Repository\
UserAddressesRepository")
 * @ORM\Table(name="user_addresses")
 */
class UserAddresses {
    /**
     * @ORM\ID
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;

    /**
     * @ORM\ManyToOne(targetEntity="UsersBundle\Entity\User")
     * @ORM\JoinColumn(name="profile_id", referencedColumnName="id")
     */
    protected $profile_id;

    /**
     * @ORM\ManyToOne(targetEntity="UserStates")
     * @ORM\JoinColumn(name="state_id", referencedColumnName="id")
     */
    protected $state_id;

    /**
     * @ORM\Column(type="boolean")
     */
    protected $isBilling;

    /**
     * @ORM\Column(type="boolean")
     */
    protected $isShipping;

    /**
     * @ORM\Column(type="string", columnDefinition="CHAR(1)")
     */
    protected $addressType;

您需要仔细阅读有关如何执行此操作的文档:

你的代码没有意义:

->add('addressFields', new UserAddressFieldsFormType());
这不是安静吗

$builder->add('addressFields', 'collection', array('type' => new UserAddressFieldsFormType())); 

因此,在第一种形式中,您将默认设置为:

$resolver->setDefaults(array(
   'data_class' => 'SCWDesignsBundle\Entity\UserAddresses'
));
因此,您添加的任何字段都应与实体中的字段相对应。所以我认为geoB是对的。如果希望在类上添加所需的映射,或者使表单独立于实体,则需要添加所需的映射,因此从默认值中删除“data_class”选项。 若要添加映射,请考虑以下代码:OntOMoNe关系:

 /**
 * @ORM\OneToMany(targetEntity="UserAddressFields", mappedBy="user_address", cascade={"persist", "remove"})
 */
protected $addressFields;

public function addAddressField($addressField) {
    $this->addressFields[] = $addressField;
}

public function removeAddressField() {...}

public function getAddressFields() {...}

public function __construct()
{
    $this->addressFields = new ArrayCollection();
}
如果你把这和纳瓦尔的答案结合起来:

$builder->add('addressFields', 'collection', array('type' => new UserAddressFieldsFormType()));

它应该有用

上述实体UserAddresses未显示错误消息中所述的属性addressFields。疏忽?即使您将其更改为存在的属性,它仍然会执行相同的操作,据我所知,它基本上是一个标签,因此,当您在视图页面中格式化它时,您会在此处使用form.label.property和addressFields也有其getter和setter?也许你可以编辑你的实体来显示它们。是的,它们是通过控制台生成的。我添加这些字段并不是为了节省空间。是的,这是我尝试的第一件事,我尝试了多次将字段添加到表单中。我尝试了上面提到的方法,$builder->add'addressFields',collection',array'type'=>newuseraddressfieldsformtype,'allow_add'=>true;也所有的错误都是一样的。看来你的答案和anegrea的结合解决了最初的问题,即不能显示一个表单和多个实体,谢谢你的帮助!这似乎已经做到了,我在阅读文档时有点困惑,为什么我需要一个集合来添加表单。就能够将表单显示为一个表单而言,这似乎解决了我最初的问题。现在开始实际提交数据!:非常感谢。
Neither the property "addressFields" nor one of the methods
"getAddressFields()", "isAddressFields()", "hasAddressFields()", "__get()" exist
and have public access in class "SCWDesignsBundle\Entity\UserAddresses".
->add('addressFields', new UserAddressFieldsFormType());
$builder->add('addressFields', 'collection', array('type' => new UserAddressFieldsFormType())); 
$resolver->setDefaults(array(
   'data_class' => 'SCWDesignsBundle\Entity\UserAddresses'
));
 /**
 * @ORM\OneToMany(targetEntity="UserAddressFields", mappedBy="user_address", cascade={"persist", "remove"})
 */
protected $addressFields;

public function addAddressField($addressField) {
    $this->addressFields[] = $addressField;
}

public function removeAddressField() {...}

public function getAddressFields() {...}

public function __construct()
{
    $this->addressFields = new ArrayCollection();
}
$builder->add('addressFields', 'collection', array('type' => new UserAddressFieldsFormType()));