सिद्धांत पहचान मानचित्र . का उपयोग करता है वस्तुओं को ट्रैक करने के लिए पैटर्न। इसलिए जब भी आप डेटाबेस से कोई वस्तु प्राप्त करते हैं, तो सिद्धांत इस वस्तु का संदर्भ उसके UnitOfWork के अंदर रखता है। और मूल रूप से यह आईडी को अपने UnitOfWork के अंदर वस्तुओं को प्रबंधित करने के लिए एक कुंजी के रूप में उपयोग करता है।
उदा.
$objectA = $this->entityManager->find('EntityName', 1);
$objectB = $this->entityManager->find('EntityName', 1);
डेटाबेस के विरुद्ध केवल एक चयन क्वेरी को सक्रिय करेगा। दूसरे कॉल में सिद्धांत पहचान मानचित्र की जांच करेगा और डेटाबेस राउंडट्रिप किए बिना एक ही आईडी ढूंढेगा। यदि आप प्रॉक्सी ऑब्जेक्ट का उपयोग करते हैं, तो भी ऑब्जेक्ट की एक ही आईडी होगी।
लेकिन के लिए
$objectA = $repository->findOneBy(array('name' => 'Benjamin'));
$objectB = $repository->findOneBy(array('name' => 'Benjamin'));
इस तथ्य के बावजूद कि आप एक ही वस्तु का संदर्भ देते हैं, आपको अपने SQL लॉग में दो प्रश्न दिखाई देंगे। सिद्धांत केवल वस्तुओं को आईडी से जानता है , इसलिए एक अलग मानदंड के लिए एक क्वेरी को डेटाबेस में जाना होगा, भले ही इसे पहले निष्पादित किया गया हो।
लेकिन सिद्धांत स्मार्ट है, यह एक नई इकाई नहीं बनाता है लेकिन आईडी प्राप्त करता है और देखता है कि यह स्मृति में है या नहीं।
PHP कॉपी-ऑन-राइट प्रतिमान का अनुसरण करता है, यह एक अनुकूलन सिद्धांत है। एक चर की वास्तविक प्रतिलिपि केवल तभी बनाई जाती है जब चर को संशोधित किया जाता है। तो एक अनुरोध के लिए स्मृति उपयोग जो डेटाबेस से वस्तुओं को पढ़ता है, वही है जैसे कि एक चर प्रतिलिपि नहीं रखना है।
इसलिए केवल जब आप वेरिएबल बदलते हैं तो आपके एप्लिकेशन आंतरिक रूप से नए वेरिएबल बनाते हैं और मेमोरी की खपत करते हैं।
इसलिए जब आप फ्लश call को कॉल करें , सिद्धांत पहचान मानचित्र पर पुनरावृति करता है और वर्तमान मूल्यों के साथ प्रत्येक obecjts की मूल संपत्ति की तुलना करता है। यदि परिवर्तन पाए जाते हैं तो यह एक अद्यतन क्वेरी के लिए कतारबद्ध हो जाएगा। डेटाबेस में केवल वास्तव में अपडेट किए गए फ़ील्ड बदले जाते हैं।
कैसे अनुकूलित करें
इसलिए कभी-कभी वस्तुओं को केवल पढ़ने के लिए (केवल सम्मिलित करें और निकालें) के रूप में चिह्नित करना समझ में आता है, इसलिए वे परिवर्तन में नहीं होंगे (आप इसे अपनी एक्सएमएल मैपिंग फ़ाइल में या एनोटेशन के साथ या अपने PHP कोड में कर सकते हैं)।
$entityManager->getUnitOfWork()->markReadOnly($entity)
या केवल एक इकाई को फ्लश करें
$entityManager->flush($entity)