如何在Symfony2中处理实体的主/辅助/正常状态

时间:2015-01-07 21:06:16

标签: php forms symfony relationship entities

我正在开发一个应用程序,我遇到了以下内容:假设我有一个名为Contact的实体,该联系人属于公司,公司有主要联系人和次要联系人,还有剩余的联系人,我和# 39; ve命名为Normal。

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

  1. 在公司实体上有两个名为PrimaryContact和SecondaryContact的字段,并且与名为contacts的属性具有一对多关系。
  2. 我不喜欢(或者我不是100%怎么办)这个选项是在Contact实体上我需要为2个一对一中的每一个提供一个inversedBy字段属性和1对一对多的关系和我个人的想法是,这有点混乱的目的。

    1. 在名为Type的Contact实体上拥有一个属性,如果它是主要的,次要的或正常的,并且在与Contact有关的Company方法中,我会修改它并添加getPrimaryContact,getSecondaryContact等。
    2. 我不喜欢这个选项是我需要为公司提供2个未映射的属性,我需要在表单类型上做很多事情才能使它顺利运行。

      我的问题是这种结构的最佳方法是什么,以及如何处理表单和这些依赖项。如果这还不够明确,请告诉我,我会花时间准备代码和图片的示例。

2 个答案:

答案 0 :(得分:0)

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

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

假设您有实体公司和实体联系

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

<?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));

您如何看待这种方法? 如果我学得更快,我会告诉你;)

答案 1 :(得分:0)

感谢@Cerad,我采取了以下方法:

  1. 我在公司有一个OneToMany属性来容纳所有联系人。
  2. 实现了getPrimaryContact / setPrimaryContact方法并循环遍历所有联系人并检索我想要的类型之一。对于中学也是如此。
  3. 在公司的表单类型上我的问题是我有'mapped'=&gt; 'false'选项,我删除了这个,因为我实现了getter和setter SF2知道它必须转到这些方法。
  4. `

    <?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。