如何处理Symfony2中实体的主要/次要/正常状态


How to handle Primary/Secondary/Normal statuses for entity in Symfony2

我正在开发一个应用程序,我遇到了以下内容:假设我有一个名为联系人的实体,该联系人属于一家公司,该公司有一个主要联系人和一个次要联系人,并且还有我命名为"正常"的其余联系人。

我的问题是,在谈论实体属性和表单处理时,最好的方法是什么。我有两件事:

  1. 在公司实体上具有 2 个名为"主要联系人"和"次要联系人"的字段,并且还与名为"联系人"的属性具有一对多关系。

不喜欢(或者我不是 100% 如何做)关于此选项的是,在联系人实体上,我需要为 2 个一对一属性中的每个属性提供一个 inreverseedBy 字段,对于一对多关系还有 1,我个人的想法是,这有点混乱。

  1. 在联系人实体上具有一个名为 Type 的属性,如果它是主要、次要或正常,并且在与联系人相关的公司方法中,我会修改它并添加 getPrimaryContact、getSecondaryContact 等。

我不喜欢这个选项的是,我需要为公司提供 2 个未映射的属性,并且我需要在表单类型上做很多事情才能使其顺利工作。

我的问题是这种结构的最佳方法是什么,以及如何处理表单和这些依赖关系。如果这还不够清楚,请告诉我,我将花时间准备一个带有代码和图像的示例。

我还

不是Symfony专家,但我目前正在学习操作和关系!并且没有简单的方法来与属性建立关系。

您必须创建一个表示您的关系的实体。

假设您有一个实体公司和实体联系人

然后,您将有一个名为 CompanyContact whick 的实体将表示对象之间的关系。(您可以在关系实体中拥有任意数量的属性)。(不确定您的情况的多对一,但想法是一样的)

<?php
namespace My'Namespace'Entity
use Doctrine'ORM'Mapping as ORM
/**
 * @ORM'Entity(repositoryClass="My'Namespace'Entity'CompanyContactRepository")
 */
class CompanyContact
{
  /**
   * @ORM'Column(name="id", type="integer")
   * @ORM'Id
   * @ORM'GeneratedValue(strategy="AUTO")
   */
  private $id;
  /**
   * @ORM'Column(name="contact_type", type="string", length=255)
   */
  private $contactType;
  /**
   * @ORM'ManyToOne(targetEntity="My'Namespace'Entity'Company")
   * @ORM'JoinColumn(nullable=false)
   */
  private $company;
  /**
   * @ORM'ManyToOne(targetEntity="My'Namespace'Entity'Contact")
   * @ORM'JoinColumn(nullable=false)
   */
  private $contact;
}

在控制器中,您可以执行以下操作:

$em = $this->getDoctrine()->getManager();
$company            = $em->getRepository('YourBundle:Company')->find($yourCompanyId);
$yourType           = "primary";
$companyContacts    = $em->getRepository('YourBundle:CompanyContact')
                         ->findBy(array('company' => $company, 'type' => $yourType));

您如何看待这种方法?如果我很快知道更多,我会让你发布;)

感谢@Cerad这是我采取的以下方法:

  1. 我在公司有一个OneToMany财产来保存所有联系人。
  2. 实现了getPrimaryContact/setPrimaryContact方法,并遍历所有联系人并检索我想要的类型之一。对次要做了同样的事情。
  3. 在公司的表单类型上,我的问题是我有"映射"=>"false"选项,我删除了它,因为我实现了 SF2 知道它必须转到这些方法的 getter 和 setter。

'

<?php
namespace XYZ'Entity;
/**
 * @ORM'Entity
 * @ORM'HasLifecycleCallbacks()
 */
class Company
{
    ... 
    /**
     * @ORM'OneToMany(targetEntity="'XYZ'Entity'Contact", mappedBy="company", cascade={"persist", "remove"})
     */
    private $contacts;
    public function getPrimaryContact() { ... }
    public function setPrimaryContact(Contact $contact) { //Set the type of $contact and add it $this->addContact($contact) }
    public function getSecondaryContact() { ... }    
    public function setSecondaryContact(Contact $contact) { //Set the type of $contact and add it $this->addContact($contact) }
}`

对于表单类型,我有:

'

class CompanyType extends AbstractType
{
    /**
     * @param FormBuilderInterface $builder
     * @param array $options
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ...
            ->add('primaryContact', new ContactType())
            ->add('secondaryContact', new ContactType())
    }
    ...
}`

有了这套,一切都很顺利,我可以毫不费力地进行 CRUD。