我有一個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
插入表中,但是當我嘗試編輯用戶,我有兩個集合場(複製)。
這裏我的模板文件(小枝):從您的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>
問題是,表單將始終顯示一個社交,並將始終最終保存它。在您的$ form-> isValid後,您可以檢查社交實體是否填寫了任何值。如果沒有,則在繼續之前將其刪除。甚至更好(雖然理解更復雜)使用數據轉換器,所以這會自動發生:http://jnotes.jonasfischer.net/2013/11/symfony2-form-types-and-non-mandatory-relationships/ – Cerad
順便說一句,級聯選項應該放在實體的用戶端。 – Cerad
@Cerad默認情況下,它不應該包含一個集合子窗體,對吧? –