Я занимаюсь разработкой приложения, и я столкнулся со следующим: допустим, у меня есть объект с именем Contact, этот контакт принадлежит компании, а у компании есть основной контакт и дополнительный контакт, а также остальные контакты, которые я назвал обычными. ,
Мой вопрос в том, что лучше всего подходит для этого, когда речь идет о свойствах сущностей, а также об обработке форм. Я думаю о двух вещах:
Что мне не нравится (или я не на 100%, как это сделать) в этой опции, так это то, что в сущности «Контакт» мне потребуется поле inversedBy для каждого из 2 свойств «один к одному», а также 1 для одного свойства. отношения ко многим, и моя личная мысль, что это немного грязно для этой цели.
Что мне не нравится в этом варианте, так это то, что мне нужно было бы иметь 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 я выбрал следующий подход:
`
<?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 без особой борьбы.