表单设置选项Symfony 3

时间:2017-12-21 14:39:10

标签: forms symfony

我正在使用Symfony 3来建立一个网站。我有一个与Users关系的实体(OneToOne),以便建立情侣。 (我没有其他人知道如何轻松地做到这一点)

最终目标是创建一个表单,以引用id中其他Users的{​​{1}}。所以我创建了一个couple字段并将其分配给IntegerType,但我无法设置它(因为没有id)。所以我想知道是否有setId(...)选项(在Doc / Tests中找不到),如果没有,我怎么能实现呢?

注册新夫妇的步骤应该是:

  1. 发送新ID(另一个setter)[FORM]
  2. 获取其他UsersUsers)[BDD]
  3. 如果他有$userCouple = ...findOne...,那么$couple == null$userCouple->setCouple($this)
  4. 所以我的$this->setCouple($userCouple)实体看起来像是:

    Users

    我的表格如下:

    <?php
    
    namespace Acme\UserBundle\Entity;
    
    use Doctrine\ORM\Mapping as ORM;
    use FOS\UserBundle\Model\User as BaseUser;
    
    /**
     * Users
     *
     * @ORM\Table(name="users")
     * @ORM\Entity(repositoryClass="Acme\UserBundle\Repository\UsersRepository")
     */
    class Users extends BaseUser
    {
        /**
         * @var int
         *
         * @ORM\Column(name="id", type="integer")
         * @ORM\Id
         * @ORM\GeneratedValue(strategy="AUTO")
         */
        protected $id;
    
        /**
         * @ORM\OneToOne(targetEntity="Acme\UserBundle\Entity\Users")
         * @ORM\JoinColumn(nullable=true)
         */
        protected $couple;
    
        /**
         * Get id
         *
         * @return int
         */
        public function getId()
        {
            return $this->id;
        }
    
        /**
         * Set couple.
         *
         * @param \Acme\UserBundle\Entity\Users|null $couple
         *
         * @return Users
         */
        public function setCouple(\Acme\UserBundle\Entity\Users $couple = null)
        {
            $this->couple = $couple;
    
            return $this;
        }
    
        /**
         * Get couple.
         *
         * @return \Acme\UserBundle\Entity\Users|null
         */
        public function getCouple()
        {
            return $this->couple;
        }
    
    }
    

1 个答案:

答案 0 :(得分:0)

您应该使用一对一的自引用关系解决此问题(请参阅更多here)。基本上,couple将替换为partner,最适合的情况是:

...
/**
 * @OneToOne(targetEntity="User")
 * @JoinColumn(name="partner_id", referencedColumnName="id")
 */
protected $partner;
...

然后在表单中,您可以使用EntityType(不确定为什么要首先使用IntegerType)并执行以下操作:

$builder->add('users', EntityType::class, array(
    // query choices from this entity
    'class' => 'UserBundle:User',

    // use the User.username property as the visible option string
    'choice_label' => 'username',
));

当然,您可以使用query_builder选项(传递自定义查询)或choices从您显示为可能合作伙伴的用户列表中排除您正在编辑个人资料的用户要使用的用户实体的集合(首先获取它们并过滤掉当前用户)。