आप सिम्फनी रूपों के साथ सबसे कठिन समस्याओं में से एक में आ गए हैं। सौभाग्य से, कुछ अच्छे दस्तावेज हैं। मुझे महत्वपूर्ण चरणों को संक्षेप में बताएं।
आप सही कह रहे हैं:यदि आप किसी व्यक्ति के दृष्टिकोण से उस संबंध में हेरफेर करना चाहते हैं, तो इकाई व्यक्ति को पर्सनजॉब के साथ अपने संबंधों के बारे में जानने की आवश्यकता है। तो आपको एक संपत्ति जोड़ने की जरूरत है:
// src/AppBundle/Entity/Person.php
/**
* @ORM\OneToMany(targetEntity="PersonJob", mappedBy="person")
*/
private $personJobs;
public function __construct()
{
$this->personJobs = new \Doctrine\Common\Collections\ArrayCollection();
}
और फिर आपके पास फॉर्म टाइप होगा
// src/AppBundle/Form/PersonType.php
$builder
->add('name')
->add('firstname')
->add('personJobs', CollectionType::class, array(
'entry_type' => PersonJobType::class,
'allow_add' => true,
)
;
personJobs
के प्रकार पर ध्यान दें खेत। चूंकि एक व्यक्ति के पास कई व्यक्ति नौकरियां हो सकती हैं, इसलिए आपको एक फॉर्म प्रकार की आवश्यकता होती है जो संग्रह को संभाल सके। यह बिल्ट-इन CollectionType
. का उद्देश्य है (इसका दस्तावेज़ीकरण देखें!
) आपको प्रपत्र प्रकार PersonJobType
. की भी आवश्यकता है , ताकि CollectionType
सब-फॉर्म बनाना जानते हैं:
class PersonJobType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('comment')
->add('datestart', DateTimeType::class)
->add('dateend', DateTimeType::class)
->add('job') // requires Job::__toString() to be defined!
;
}
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'AppBundle\Entity\PersonJob'
));
}
}
डिबगिंग उद्देश्यों के लिए, अपने नियंत्रक को
. में बदलें public function testAction()
{
$person = new Person();
$form = $this->createForm(PersonType::class, $person);
$form->add('submit', SubmitType::class);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
print '<pre>';
var_dump($form->getData());
die();
}
return $this->render('default/index.html.twig', [
'form' => $form->createView(),
]);
}
अब आगे बढ़ें और आइटम जोड़ना और हटाना
(आपको form.emails
. को बदलने जैसे मामूली बदलाव करने होंगे form.personJobs
. के साथ )।
फ़ॉर्म
फॉर्म इस तरह दिखेगा
“एक अन्य व्यक्ति की नौकरी जोड़ें” . के साथ बस व्यक्ति फ़ॉर्म लिंक:
एक व्यक्ति नौकरी जोड़ना:
कुछ और पर्सनजॉब जोड़ना:
प्राप्त डेटा
फ़ॉर्म सबमिट करें और var_dump
. का आउटपुट देखें :
object(AppBundle\Entity\Person)#247 (5) {
["id":"AppBundle\Entity\Person":private]=>
NULL
["name":"AppBundle\Entity\Person":private]=>
string(12) "Charles Dude"
["firstName":"AppBundle\Entity\Person":private]=>
string(7) "Charles"
["active":"AppBundle\Entity\Person":private]=>
bool(true)
["personJobs":"AppBundle\Entity\Person":private]=>
object(Doctrine\Common\Collections\ArrayCollection)#248 (1) {
["elements":"Doctrine\Common\Collections\ArrayCollection":private]=>
array(2) {
[0]=>
object(AppBundle\Entity\PersonJob)#962 (6) {
["id":"AppBundle\Entity\PersonJob":private]=>
NULL
["comment":"AppBundle\Entity\PersonJob":private]=>
string(19) "Something important"
["datestart":"AppBundle\Entity\PersonJob":private]=>
object(DateTime)#1088 (3) { … }
["dateend": …] => …
["person":"AppBundle\Entity\PersonJob":private]=>
NULL
["job":"AppBundle\Entity\PersonJob":private]=>
object(AppBundle\Entity\Job)#1171 (2) {
["id":"AppBundle\Entity\Job":private]=>
int(2)
["name":"AppBundle\Entity\Job":private]=>
string(5) "Job 2"
}
}
[1]=> …
}
}
दो काम किए जाने बाकी हैं:
-
person
सेट करें नेस्टेडPersonJob
. की संपत्ति नए (लेकिन अभी तक कायम नहीं) व्यक्ति के लिए ठीक से संस्थाएं। -
डॉक्ट्रिन को नए
PersonJob
. के बारे में बताएं$em->persist(…)
. पर कॉल करके इकाइयां उन पर।