2013-11-22 79 views
0

我有一個Doctrine2和兩個關聯實體的問題。Symfony2 Doctrine2可選一對多關係的問題

有一個用戶實體可以(不是必須)擁有一個或一個社會實體集合,其中包含社交網絡鏈接。

我不控制主義,我仍然在學習關係。

我想要添加/不添加社交網絡鏈接的用戶。

經過多次研究和測試,我仍然無法找到解決方案。

這裏是我的用戶實體

<?php 
//... 

/** 
* User 
* 
* @ORM\Table(name="admin_users") 
* @ORM\Entity(repositoryClass="UserRepository") 
* @ORM\HasLifecycleCallbacks() 
*/ 
class User implements AdvancedUserInterface, \Serializable 
{ 
    /** 
    * @var integer 
    * 
    * @ORM\Column(name="id", type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    private $id; 

    /** 
    * @var string 
    * 
    * @ORM\Column(name="username", type="string", length=25, unique=true) 
    */ 
    private $username; 

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

    /** 
    * 
    * @var string 
    * 
    * @Assert\NotBlank 
    */ 
    private $plainPassword; 

    //... 

    /** 
    * @var ArrayCollection 
    * 
    * @ORM\OneToMany(targetEntity="Social", mappedBy="user", cascade={"persist","remove"}) 
    * @ORM\JoinColumn(nullable=true) 
    */ 
    private $socials; 

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

    //Some getters setters 

    /** 
    * Add socials 
    * 
    * @param Social $socials 
    * @return User 
    */ 
    public function addSocials(Social $socials) 
    { 
     $this->socials[] = $socials; 
     $socials->setUser($this); 

     return $this; 
    } 

    /** 
    * Remove socials 
    * 
    * @param Social $socials 
    */ 
    public function removeSocials(Social $socials) 
    { 
     $this->socials->removeElement($socials); 
    } 

    /** 
    * Get socials 
    * 
    * @return Collection 
    */ 
    public function getSocials() 
    { 
     return $this->socials; 
    } 
} 

這裏是社會實體

<?php 

/** 
* Social 
* 
* @ORM\Table(name="admin_social") 
* @ORM\Entity(repositoryClass="SocialRepository") 
*/ 
class Social 
{ 
    /** 
    * @var integer 
    * 
    * @ORM\Column(name="id", type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    private $id; 

    /** 
    * @var string 
    * 
    * @ORM\Column(name="name", type="string", length=20, nullable=true) 
    */ 
    private $name; 

    /** 
    * @var string 
    * 
    * @ORM\Column(name="url", type="string", length=255, nullable=true) 
    */ 
    private $url; 

    /** 
    * @ORM\ManyToOne(targetEntity="User", inversedBy="socials", cascade={"persist","remove"}) 
    * @ORM\JoinColumn(name="user_id", referencedColumnName="id", nullable=true) 
    */ 
    private $user; 

    //getters setters 

    /** 
    * Set user 
    * 
    * @param User $user 
    * @return Social 
    */ 
    public function setUser(User $user) 
    { 
     $this->user = $user; 

     return $this; 
    } 

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

的用戶類型的代碼如下所示:

$builder 
    ->add('username', 'text', array(
      'attr'=> array('class' => 'span6',), 
      'label_attr' => array('class' => 'control-label'), 
     ) 
    ) 

    // .... 

    ->add('sociaux', 'collection', array('type'   => new SocialType(), 
             'allow_add' => true, 
             'allow_delete' => true, 
             'by_reference' => false,)) 
; 

最後的控制器代碼:

public function addAction() 
{ 
    $user = new User; 
    // Create the form 
    $form = $this->createForm(new UserType, $user); 
    // Gets the request 
    $request = $this->getRequest(); 
    // Checks if the request have type POST 
    if ($request->getMethod() == 'POST') { 
     // Links the request and the form 
     $form->bind($request); 
     // Checks if all input values are correct 
     if ($form->isValid()) { 
      // Save user object in database 
      $em = $this->getDoctrine()->getManager(); 
      // Persist entity user 
      $em->persist($user); 
      $em->flush(); 

      //... 
     } 
    } 

    //... 
} 

當我嘗試添加一個沒有社交實體的用戶時,我沒有錯誤,但是在數據庫中,我在社交表中有一個空值的行。請幫忙。

UPDATE

在用戶實體添加此:

if(!($socials->getName() === null && $socials->getUrl() === null)) 
{ 
     $this->socials[] = $socials; 
     $socials->setUser($this); 
} 

現在也沒有排在social插入表中,但是當我嘗試編輯用戶,我有兩個集合場(複製)。

screenshot

這裏我的模板文件(小枝):從您的User

@ORM\JoinColumn(nullable=true) 

<div class="widget-body"> 
    {{ form_start(form, { 'action': path('acme_admin_edit_user', {'id': userId}), 'attr': {'class': 'form-horizontal'} }) }} 
     <div class="control-group"> 
      {{ form_errors(form.username) }} 
      {{ form_label(form.username) }} 
      <div class="controls"> 
       {{ form_widget(form.username) }} 
      </div> 
     </div>  

     <!-- ... --> 

     <div id="acme_adminbundle_useredittype_socials" data-prototype="{{ form_row(form.socials.vars.prototype) | escape }}"> 
      {% for social in form.socials %} 
       <div> 
        <label class="required text-primary lead">Lien n°{{ loop.index }}</label> 
        <div id="acme_adminbundle_useredittype_socials_{{ loop.index0 }}"> 
         <div class="control-group"> 
          {{ form_errors(social.name) }} 
          {{ form_label(social.name) }} 
          <div class="controls"> 
           {{ form_widget(social.name) }} 
          </div> 
         </div> 
         <div class="control-group"> 
          {{ form_errors(social.url) }} 
          {{ form_label(social.url) }} 
          <div class="controls"> 
           {{ form_widget(social.url) }} 
          </div> 
         </div> 
        </div> 
       </div> 
      {% endfor %} 
     </div> 
     <div class="txt-center well"> 
      <input type="submit" class="auto-margin btn btn-primary btn-large" /> 
     </div> 
    {{ form_end(form) }} 
</div> 
+0

問題是,表單將始終顯示一個社交,並將始終最終保存它。在您的$ form-> isValid後,您可以檢查社交實體是否填寫了任何值。如果沒有,則在繼續之前將其刪除。甚至更好(雖然理解更復雜)使用數據轉換器,所以這會自動發生:http://jnotes.jonasfischer.net/2013/11/symfony2-form-types-and-non-mandatory-relationships/ – Cerad

+1

順便說一句,級聯選項應該放在實體的用戶端。 – Cerad

+0

@Cerad默認情況下,它不應該包含一個集合子窗體,對吧? –

回答

0

嘗試刪除。 @JoinColumn應該只在關係的一方定義,並且由於Social實體包含namereferencedColumnNameUser內部沒有必要。

+0

我試過你的解決方案,我沒有錯誤,但是在數據庫中,我在'Social'表中有一行空值,'user_id'列包含我剛剛添加的用戶的'id' – youssman