Как обрабатывать первичные / вторичные / нормальные состояния для сущности в Symfony2

Я занимаюсь разработкой приложения, и я столкнулся со следующим: допустим, у меня есть объект с именем Contact, этот контакт принадлежит компании, а у компании есть основной контакт и дополнительный контакт, а также остальные контакты, которые я назвал обычными. ,

Мой вопрос в том, что лучше всего подходит для этого, когда речь идет о свойствах сущностей, а также об обработке форм. Я думаю о двух вещах:

  1. Имеет 2 поля в сущности Company с именами PrimaryContact и SecondaryContact, а также имеет отношение один ко многим со свойством, называемым контактами.

Что мне не нравится (или я не на 100%, как это сделать) в этой опции, так это то, что в сущности «Контакт» мне потребуется поле inversedBy для каждого из 2 свойств «один к одному», а также 1 для одного свойства. отношения ко многим, и моя личная мысль, что это немного грязно для этой цели.

  1. Имея свойство в объекте Contact с именем Type, которое будет храниться, если оно является основным, вторичным или обычным, а также в методах Company, связанных с контактами, я бы изменил его и добавил getPrimaryContact, getSecondaryContact и т. Д.

Что мне не нравится в этом варианте, так это то, что мне нужно было бы иметь 2 несопоставленных свойства для Компании, и мне нужно было бы многое сделать для типов форм, чтобы это работало гладко.

Мой вопрос заключается в том, каков наилучший подход для этой структуры и как работать с формами и этими зависимостями. Дайте мне знать, если это не достаточно ясно, и я возьму время и подготовлю пример с кодом и изображениями.

1

Решение

Я еще не эксперт 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));

Что вы думаете об этом подходе?
Если я узнаю больше в ближайшее время, я сообщу вам;)

0

Другие решения

Благодаря @Cerad я выбрал следующий подход:

  1. У меня есть свойство OneToMany в компании для хранения всех контактов.
  2. Реализовал методы getPrimaryContact / setPrimaryContact, перебрал все контакты и получил нужный мне тип. Сделал то же самое для вторичного.
  3. Что касается типа формы компании, моя проблема заключалась в том, что у меня была опция ‘mapped’ => ‘false’, я удалил ее, так как реализовал методы получения и установки 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 без особой борьбы.

0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector