首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Symfony2嵌入式实体

Symfony2嵌入式实体
EN

Stack Overflow用户
提问于 2011-09-10 22:00:07
回答 2查看 4.1K关注 0票数 5

我有用户和电话实体,它们之间具有OneToMany关系。

我的用户实体:

代码语言:javascript
复制
namespace Project\UserBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use Doctrine\Common\Collections\ArrayCollection;

/**
 * Project\UserBundle\Entity\User
 *
 * @ORM\Table(name="user")
 * @ORM\Entity
 */
class User
{
    /* ..... */

    /**
     * @var Doctrine\Common\Collections\ArrayCollection
     *
     * @ORM\OneToMany(targetEntity="Phone", mappedBy="user")
     */
    private $phone;

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

   /**
     * Add phone
     *
     * @param Project\UserBundle\Entity\Phone $phone
     */
    public function addPhone(\Project\UserBundle\Entity\Phone $phone)
    {
        $this->phone[] = $phone;
    }

    /**
     * Get phone
     *
     * @return Doctrine\Common\Collections\Collection 
     */
    public function getPhone()
    {
        return $this->phone;
    }

    /* ..... */

}

和我的电话实体:

代码语言:javascript
复制
namespace Project\UserBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * Project\UserBundle\Entity\Phone
 *
 * @ORM\Table(name="user_phone")
 * @ORM\Entity
 */
class Phone
{
    /* ..... */

    /**
     * @ORM\ManyToOne(targetEntity="User", inversedBy="phone")
     * @ORM\JoinColumn(name="user_id", referencedColumnName="id")
     */
    private $user;

    /**
     * @var string $number
     *
     * @ORM\Column(name="number", type="string", length=128)
     */
    private $number;

    /**
     * Set user
     *
     * @param Project\UserBundle\Entity\User $user
     */
    public function setUser(\Project\UserBundle\Entity\User $user)
    {
        $this->user = $user;
    }

    /**
     * Get user
     *
     * @return Project\UserBundle\Entity\User 
     */
    public function getUser()
    {
        return $this->user;
    }

    /* ..... */
}

我删除了部分代码以使其简短,我有一个Id字段和其他与实体相关的额外字段。

在我的控制器中,我这样做:

代码语言:javascript
复制
public function showFormAction($entity)
{
    /* ..... */
    $user  = new User();
    $phone = new Phone();
    $user->addPhone($phone);

    $form = $this->createForm(new UserRegister(), $user);
    /* ..... */
}

在我的窗体类中:

代码语言:javascript
复制
class UserRegister extends AbstractType
{
    public function buildForm(FormBuilder $builder, array $options)
    {
        $builder->add('email', 'text')
                ->add('password', 'repeated', array(
                          'type' => 'password',
                          'invalid_message' => 'The password fields must match.',
                          'options' => array('label' => 'Password'),
                          'error_bubbling' => false)
                     )
                ->add('first_name', 'text')
                ->add('last_name', 'text')
                ->add('phone', 'text' );
    }

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

    public function getDefaultOptions(array $options)
    {
        return array(
            'data_class' => 'Project\UserBundle\Entity\User',
        );
    }

}

在我的树枝模板中:

代码语言:javascript
复制
<div>
    {{ form_errors(form.phone) }}
    {{ form_label(form.phone, null, { 'attr': {'class': 'span-3'} } ) }}
    {{ form_widget(form.phone, { 'attr': {'class': 'text'} } ) }}
</div>

我尝试做的基本上是允许用户拥有多个电话号码,从而在用户和电话之间建立OneToMany关系。在我的表单中,我希望在表单中显示' phone‘实体的'number’字段,然后将单个电话记录添加到相应的用户。

目前,使用上面的代码,表单正在呈现,但显示:

电话字段中的"Doctrine\Common\Collections\ArrayCollection@0000000062cf59cf00000000e32fc883“。

将窗体类结果中的'phone‘更改为'collection’为Twig_Runtime_Error "Phone Changing be converted to string“500内部服务器错误。我尝试将phone呈现为'form.phone.number‘,以便在Phone实体中获取number元素,但它显示:

对象"Symfony\Component\Form\FormView“的方法"number”不存在

我还尝试将form类中的'phone‘类型更改为' Entity’,并添加了数组以反映实体命名空间,但是它总是显示"You need to manage your Entity“错误。

我有点不知所措,不知道该怎么做,我在某处读到过,我可以分别实例化User和Phone对象,进行更改,然后逐个持久化它们。我不确定这是否是最佳实践,我的方法是创建一个User对象,向其中添加一个电话记录,然后持久化User对象。

EN

回答 2

Stack Overflow用户

发布于 2012-01-06 00:08:52

尝试使用

代码语言:javascript
复制
/**
 * @var Doctrine\Common\Collections\ArrayCollection
 *
 * @ORM\OneToMany(targetEntity="Phone", mappedBy="user", cascade={"persist"})
 */
private $phone;

对于带有持久化关系的Symfony嵌入表单,需要在注释中添加cascade={“OneToMany”}

票数 1
EN

Stack Overflow用户

发布于 2011-10-09 02:44:39

你可以通过设置$form->get(‘"Doctrine\Common\Collections\ArrayCollection@0000000062cf59cf00000000e32fc883“’)->setData(‘’)来防止播放手机消息;至于剩下的,我帮不了你,我也想要一个答案……

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7372220

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档