如何处理 Symfony2 中实体的 Primary/Secondary/Normal 状态
How to handle Primary/Secondary/Normal statuses for entity in Symfony2
我正在开发一个应用程序,我遇到了以下情况:假设我有一个名为联系人的实体,该联系人属于一家公司,该公司有一个主要联系人和一个次要联系人,还有剩余的联系人我命名为 Normal.
我的问题是,在讨论实体属性和表单处理时,最好的方法是什么。我想过两件事:
- 在 Company 实体上有 2 个字段,分别称为 PrimaryContact 和 SecondaryContact,并且与名为 contacts 的属性具有一对多关系。
关于此选项,我不喜欢(或者我不是 100% 怎么做)的是,在 Contact 实体上,我需要为 2 个一对一属性和一对多关系也是 1,我个人认为这有点混乱。
- 在联系人实体上有一个名为 Type 的属性,如果它是主要的、次要的或正常的,并且在与联系人有关的公司方法中,我将修改它并添加 getPrimaryContact、getSecondaryContact 等。
我不喜欢这个选项的是,我需要为公司提供 2 个未映射的属性,并且我需要在表单类型上做很多事情才能让它顺利工作。
我的问题是这种结构的最佳方法是什么以及如何处理表单和这些依赖项。如果这还不够清楚,请告诉我,我会花时间准备一个包含代码和图像的示例。
我还不是 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));
您如何看待这种方法?
如果我很快了解更多信息,我会通知您 ;)
感谢@Cerad,这是我采用的以下方法:
- 我在公司有一个 OneToMany 属性 来保存所有联系人。
- 实施了 getPrimaryContact/setPrimaryContact 方法并遍历所有联系人并检索我想要的类型之一。对中学也做了同样的事情。
- 关于公司的表单类型,我的问题是我有 'mapped' => 'false' 选项,我删除了它,因为我实现了 getters 和 setters SF2 知道它必须去这些方法。
`
<?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。
我正在开发一个应用程序,我遇到了以下情况:假设我有一个名为联系人的实体,该联系人属于一家公司,该公司有一个主要联系人和一个次要联系人,还有剩余的联系人我命名为 Normal.
我的问题是,在讨论实体属性和表单处理时,最好的方法是什么。我想过两件事:
- 在 Company 实体上有 2 个字段,分别称为 PrimaryContact 和 SecondaryContact,并且与名为 contacts 的属性具有一对多关系。
关于此选项,我不喜欢(或者我不是 100% 怎么做)的是,在 Contact 实体上,我需要为 2 个一对一属性和一对多关系也是 1,我个人认为这有点混乱。
- 在联系人实体上有一个名为 Type 的属性,如果它是主要的、次要的或正常的,并且在与联系人有关的公司方法中,我将修改它并添加 getPrimaryContact、getSecondaryContact 等。
我不喜欢这个选项的是,我需要为公司提供 2 个未映射的属性,并且我需要在表单类型上做很多事情才能让它顺利工作。
我的问题是这种结构的最佳方法是什么以及如何处理表单和这些依赖项。如果这还不够清楚,请告诉我,我会花时间准备一个包含代码和图像的示例。
我还不是 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));
您如何看待这种方法? 如果我很快了解更多信息,我会通知您 ;)
感谢@Cerad,这是我采用的以下方法:
- 我在公司有一个 OneToMany 属性 来保存所有联系人。
- 实施了 getPrimaryContact/setPrimaryContact 方法并遍历所有联系人并检索我想要的类型之一。对中学也做了同样的事情。
- 关于公司的表单类型,我的问题是我有 'mapped' => 'false' 选项,我删除了它,因为我实现了 getters 和 setters SF2 知道它必须去这些方法。
`
<?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。