我正在开发一个应用程序,我遇到了以下内容:假设我有一个名为Contact的实体,该联系人属于公司,公司有主要联系人和次要联系人,还有剩余的联系人,我和# 39; ve命名为Normal。
我的问题是,在谈论实体属性和表单处理时,最好的方法是什么。我有两件事:
我不喜欢(或者我不是100%怎么办)这个选项是在Contact实体上我需要为2个一对一中的每一个提供一个inversedBy字段属性和1对一对多的关系和我个人的想法是,这有点混乱的目的。
我不喜欢这个选项是我需要为公司提供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,我采取了以下方法:
`
<?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。