2010-08-03 13 views
7

मैं सटीक SQL INSERT क्वेरी प्राप्त करना चाहता हूं जो किसी वस्तु की सहेजने() विधि को कॉल करते समय सिद्धांत उत्पन्न करता है।सिद्धांत - पोस्टसेव() ईवेंट में SQL INSERT क्वेरी कैसे प्राप्त करें?

अधिमानतः, मैं इसे मॉडल के पोस्टसेव() ईवेंट में प्राप्त करना चाहता हूं और इसे एक txt फ़ाइल में लॉग इन करना चाहता हूं।

उदाहरण के लिए:

<?php 
$user = new User(); // A Doctrine Model with timestampable behavior enabled 
$user->first_name = 'Manny'; 
$user->last_name = 'Calavera'; 
$user->save(); 
?> 

मैं प्राप्त करना चाहते हैं/log निम्नलिखित SQL क्वेरी:

INSERT INTO user (first_name, last_name, created_at, updated_at) VALUES ('Manny', 'Calavera', '2010-08-03 12:00:00', '2010-08-03 12:00:00'); 

इस की आवश्यकता होगी, के लिए पृष्ठभूमि, यह है कि मैं बाद में द्वारा डेटा बड़े पैमाने पर आयात करना चाहते हैं txt फ़ाइल को पार्स करना।

उत्तर

1

मुझे नहीं लगता कि ऐसा करने का कोई आसान तरीका है क्योंकि बचत() के व्यवहार कुछ अलग-अलग चीजों (यदि आप डालने/अपडेट कर रहे हैं) के आधार पर भिन्न होते हैं।

आप एक सिद्धांत क्वेरी ऑब्जेक्ट बनाया था, तो आप इस तरह getSqlQuery() विधि कॉल कर सकते हैं:

$q = Doctrine_Query::create() 
->select('u.id') 
->from('User u'); 

echo $q->getSqlQuery(); 

लेकिन बचाने() एक विधि, नहीं एक वस्तु है तो यह काम नहीं करेगा । मुझे लगता है कि आपको पता लगाने के लिए कुछ कोड में हैक करना होगा कि क्या आप फ्लाई पर लॉग इन करने के लिए एक क्वेरी डालने या अपडेट कर रहे हैं और फिर सहेजें() का उपयोग करें।

मुझे पता है कि यह सुझाव आदर्श नहीं है क्योंकि यह 'बिल्कुल' लॉगिंग नहीं कर रहा है जो बचाता है() कर रहा है लेकिन प्रयोजनों के लिए आपने कहा है कि इसे अभी भी काम करना चाहिए।

0

यहाँ एक नज़र डालें: http://www.phpandstuff.com/articles/codeigniter-doctrine-scratch-day-8-hooks-profiling-dql और अनुभाग पर जाएँ सिद्धांत और साथ रूपरेखा अध्यक्षता में एक प्रोफाइलर हुक बना रहा है। Altough यह कोडइग्निटर ढांचे के उपयोग के लिए है, इसे आपके पर्यावरण के लिए आसान ढंग से अपनाया जा सकता है क्योंकि कोड के ढांचे के लिए कोई निर्भरता नहीं है।

आप मूल रूप से एक कनेक्शन प्रोफाइलर स्थापित करना चाहते हैं और इसे सभी प्रश्नों को फ़ाइल में लिखना चाहते हैं। मैं सुझाव देता हूं कि फ़ाइल में सभी प्रश्नों को बेहतर "लॉग" जैसी भावनाएं शामिल करें। लेखों के अंदर कई ढांचे की बातों से भ्रमित न हों। उदाहरण अन्य परिदृश्यों में बहुत अच्छी तरह से काम करते हैं (थोड़ी समझ के साथ और & पेस्टिंग)।

0

आप sfDoctrineDatabase वर्ग से प्रोफाइलर उपयोग कर सकते हैं। सभी प्रश्नों को पकड़ने के लिए getQueryExecutionEvents का उपयोग करें।

$databaseManager = sfContext::getInstance()->getDatabaseManager(); 
if ($databaseManager) { 
    foreach ($databaseManager->getNames() as $name) { 
     $database = $databaseManager->getDatabase($name); 
     if ($database instanceof sfDoctrineDatabase && $profiler = $database->getProfiler()) { 
      foreach ($profiler->getQueryExecutionEvents() as $event) { 
       $conn = $event->getInvoker() instanceof Doctrine_Connection ? $event->getInvoker() : $event->getInvoker()->getConnection(); 
       $params = sfDoctrineConnectionProfiler::fixParams($event->getParams()); 
       $query = $event->getQuery() ; 

       foreach ($params as $param) { 
        $param = htmlspecialchars($param, ENT_QUOTES, sfConfig::get('sf_charset')); 
        $query = join(var_export(is_scalar($param) ? $param : (string) $param, true), explode('?', $query, 2)); 
       } 
       // log the $query here, or use the symfony's logger 
       // sfContext::getInstance()->getLogger()->debug(sprintf('Query Run !! %s ', $query)); 
      } 
     } 
    } 
} 

न मानकों के साथ क्वेरी शामिल होने के लिए भूल जाते हैं

(इसलिए यह स्थान ले लेगा मूल्यों के साथ?): डी

+0

$ ईवेंट से पहले कुछ शर्त जोड़ने के लिए मत भूलना-> getQuery(), आप "if (! (Stripos ($ event-> getQuery, 'INTO लॉग') का उपयोग कर सकते हैं) && (strtoupper (substr ($ event) -> getQuery(), 0, 6))! = 'चयन करें') && strtoupper (substr ($ event-> getQuery(), 0, 3))! = 'सेट') " – HQM

0

आप क्यों कैसे सिम्फोनी डेवलपर्स यह कर देखने की कोशिश नहीं करते ? डॉक्टर here के लिए अपने वेबडिबग टूलबार को देखें। WebDebug टूलबार आपके द्वारा किसी पृष्ठ पर किए गए सभी क्वेरी आउटपुट करता है।

DoctrineEvent पर एक हुक है, और मुझे लगता है कि आप जो चाहते हैं उसे करने के लिए कोड को संशोधित कर सकते हैं। getDoctrineEvents और getSqlLogs विधि देखें।

उम्मीद है कि इससे मदद मिलती है। अगर आपको और स्पष्टीकरण की आवश्यकता है, तो कृपया इसे टिप्पणी में लिखें, मैं समझाने के लिए अपनी पूरी कोशिश करूंगा।

संबंधित मुद्दे