我正在开发一个应用程序,我遇到了以下内容:假设我有一个名为联系人的实体,该联系人属于一家公司,该公司有一个主要联系人和一个次要联系人,并且还有我命名为"正常"的其余联系人。
我的问题是,在谈论实体属性和表单处理时,最好的方法是什么。我有两件事:
- 在公司实体上具有 2 个名为"主要联系人"和"次要联系人"的字段,并且还与名为"联系人"的属性具有一对多关系。
不喜欢(或者我不是 100% 如何做)关于此选项的是,在联系人实体上,我需要为 2 个一对一属性中的每个属性提供一个 inreverseedBy 字段,对于一对多关系还有 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这是我采取的以下方法:
- 我在公司有一个OneToMany财产来保存所有联系人。
- 实现了getPrimaryContact/setPrimaryContact方法,并遍历所有联系人并检索我想要的类型之一。对次要做了同样的事情。
- 在公司的表单类型上,我的问题是我有"映射"=>"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。