Symfony2 - 在持久化时管理未使用实体的实体关系

时间:2015-04-17 21:48:30

标签: php symfony orm entity symfony-2.4

我有两个实体(Customer& PhoneNumber),它们通过ManyToMany连接彼此实现。

当尝试以一种形式显示两个实体时,我使用以下语句:

$customer = new Customer();
$customer->addPhoneNumber(new PhoneNumber());
$form = $this->createForm(new CustomerType(), $customer, array(
    'action' => $this->generateUrl('customer_add'),
));

在确认表格后,我需要检查表格中的PhoneNumber部分是否已被使用,因为输入电话号码不是必需的。我需要这样做的原因是:当试图持有一个连接了PhoneNumber-Entity且没有设置值的客户(= NULL值)时,我从数据库中得到一个NOT NULL-Error。

所以我的工作是:在验证表格后,如果没有输入电话号码,我会将电话号码 - 实体 - 关系删除给客户。

$phoneNumber = $customer->getPhoneNumbers()->first();
if(empty($phoneNumber->getPrefix()) && empty($phoneNumber->getNumber())) {
    $customer->removePhoneNumber($phoneNumber);
}

这会导致以下问题:

  • 我不再与电话号码实体有关系。现在,每次我使用它时,我都必须对客户实体的关系进行各种检查。
  • 此外,我不喜欢在成功验证后编辑客户实体的事实。
  • 如果一个实体与其他实体有很多关系,我在这里做的这个添加和删除过程会变得非常难看和混乱。

有没有更好的方法来做我想在这里做的事情?


Customer.php:

/**
 * @ORM\ManyToMany(targetEntity="AppBundle\Entity\PhoneNumber", mappedBy="customers", cascade={"persist"})
 * @Assert\Valid()
 **/
protected $phoneNumbers;

PhoneNumber.php:

/**
 * @ORM\ManyToMany(targetEntity="AppBundle\Entity\Customer", inversedBy="phoneNumbers", cascade={"persist"})
 * @ORM\JoinTable(name="cp_relation")
 **/
protected $customers;

CustomerType.php:

# ...
->add('phoneNumbers', 'collection', array(
          'type' => new PhoneNumberType(),
          'options' => array(
              'required' => false,
          )
     ))

1 个答案:

答案 0 :(得分:3)

正如聊天室中所讨论的,最佳解决方案是使用collection type并设置allow_add=true并使用jQuery& prototype字段,允许用户添加字段。

但在您的情况下(因为您不想使用jquery并依赖js),您可以将静态字段渲染为(不要忘记设置allow_add=true):

<input type="email" id="form_emails_0" name="form[emails][0]" value="" /><br>
<input type="email" id="form_emails_1" name="form[emails][1]" value="" />