जब मैं फॉर्म जमा कर रहा था और ऑब्जेक्ट मॉडल बना रहा था तो मुझे SQLSTATE[23502]: Not null violation: 7 ERROR: null value in column "object_id" त्रुटि मिली।

मेरे पास दो सिद्धांत संस्थाएं हैं:

class Object {
    /**
     * @var Document[]|ArrayCollection
     * @ORM\OneToMany(targetEntity="App\Entity\Document", mappedBy="mainObject", cascade={"persist"})
     */
    private $documents;
}
class Document
{
    /**
     * @ORM\ManyToOne(targetEntity="App\Entity\Object", inversedBy="documents")
     * @ORM\JoinColumn(nullable=false)
     */
    private $object;
}

और सिम्फनी फॉर्म:

class ObjectType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('documents', CollectionType::class, [
                'allow_add' => true,
                'entry_type' => DocumentType::class,
            ])
        ;
    }
}

मेरा नियंत्रक कोड:

$object = new Object();
$form = $this->formFactory->create(ObjectType::class, $object);
$form->submit(json_decode($request->getContent(), true), false);

if ($form->isSubmitted() && $form->isValid()) {
    $this->entityManager->persist($object);
    $this->entityManager->flush();
}

त्रुटि इसलिए होती है क्योंकि सिद्धांत ऑब्जेक्ट से पहले दस्तावेज़ को सहेजता है। क्या बचत व्यवहार को बदलना संभव है?

0
Vadim Selyakov 22 अगस्त 2019, 17:05

1 उत्तर

सबसे बढ़िया उत्तर

इसे हल करने के लिए आप संग्रह प्रकार पर by_reference => false का उपयोग कर सकते हैं। इसे गलत पर सेट करके, आप कह रहे हैं कि संपत्ति तक पहुँचने के बजाय हमेशा विधियों का उपयोग करें।

$builder
    ->add('documents', CollectionType::class, [
        'allow_add' => true,
        'entry_type' => DocumentType::class,
        'by_reference' => false,
    ]);

कुछ मामलों में, संपत्ति का उपयोग विधियों के बजाय सीधे किया जाएगा। आप इस प्रॉपर्टी के बारे में यहां पढ़ सकते हैं। .

आप ऑब्जेक्ट पर अपनी addDocument() विधि पर एक नया दस्तावेज़ जोड़ते समय भी ऑब्जेक्ट सेट करना चाहेंगे। यह कुछ इस तरह दिखना चाहिए:

public function addDocument(Document $document): object
{
    $document->setObject($this);

    $this->getDocuments()->add($document);

    return $this;
}

इससे आपकी समस्या हल हो जानी चाहिए। मुझे यह भी लगता है कि object नाम की इकाई का होना थोड़ा भ्रमित करने वाला है।

2
MylesK 22 अगस्त 2019, 17:25