2012-05-17 9 views
10

द्वारा प्रयोग किया जाता एसक्यूएल मुद्रित करने के लिए मैं से dbYii - कैसे findAll

$criteria = new CDbCriteria(); 
    $criteria->condition = 't.date BETWEEN "'.$from_date.'" AND "'.$to_date.'"'; 
    $criteria->with = array('order'); 

    $orders = ProductOrder::model()->findAll($criteria); 

क्या यह संभव है एसक्यूएल कि findAll द्वारा किया जाता है पाने के लिए कुछ रिकॉर्ड प्राप्त करने के लिए निम्नलिखित कोड है? मुझे पता है कि आप इसे डीबग कंसोल से प्राप्त कर सकते हैं। लेकिन मैं पृष्ठभूमि में स्क्रिप्ट चल रहा हूँ

उत्तर

16

yiic.php का उपयोग कर आप आवेदन लॉग में निष्पादित प्रश्नों लॉग इन करें और भली-भांति समझ सकते हैं। कॉन्फ़िग फ़ाइल में कुछ इस तरह:

'components' => array(
    'db'=>array(
    'enableParamLogging' => true, 
), 
    'log'=>array(
    'class'=>'CLogRouter', 
    'routes'=>array( 
     array(
     'class'=>'CFileLogRoute', 
     'levels'=>'trace,log', 
     'categories' => 'system.db.CDbCommand', 
     'logFile' => 'db.log', 
    ), 
    ), 
), 
); 

कुछ मामलों में (जैसे जब परीक्षण चल रहा है), तो आप भी इस बात के लिए प्रक्रिया के अंत में Yii::app()->log->processLogs(null); कॉल करने के लिए काम करने के लिए की आवश्यकता होगी।

बेशक, एक बार जब आप वहां हों तो कुछ भी आपको अपना लॉग रूट लिखने से रोक नहीं रहा है जो लॉग संदेशों के साथ कुछ अलग करता है, लेकिन ध्यान दें कि अनुरोध के अंत में लॉग संसाधित होते हैं (या जब आप processLogs पर कॉल करते हैं) , हर बार जब आप कुछ लॉग इन नहीं करते हैं।


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

$criteria = new CDbCriteria(); 
$criteria->condition = 't.date BETWEEN :from_date AND :to_date'; 
$criteria->params = array(
    ':from_date' => $from_date, 
    ':to_date' => $to_date, 
); 
$criteria->with = array('order'); 

$orders = ProductOrder::model()->findAll($criteria); 
+0

ऐसा लगता है कि प्रत्यक्ष एसक्यूएल कमांड के साथ डीएओ सीडीबीक्रिटिरिया का उपयोग करने से कहीं अधिक सरल/तेज है? – itachi

+3

परिणाम के साथ आप क्या करना चाहते हैं, इस पर निर्भर करता है, मुझे लगता है। यदि आप मॉडल कार्यक्षमता (उदा। सत्यापन) का उपयोग करना चाहते हैं, तो एआर का उपयोग करना एक स्पष्ट विकल्प है। निजी तौर पर, मैं एआर पसंद करता हूं और डीएओ को केवल जटिल परिस्थितियों के लिए छोड़ देता हूं जैसे कि शामिल होने से जुड़े अपडेट। इस तरह मैं सामान्य परिस्थितियों के लिए मॉडल स्कोप का उपयोग कर सकता हूं और स्कीमा या व्यावसायिक तर्क बदलते समय सभी प्रत्यक्ष आदेशों की मैन्युअल रूप से समीक्षा/अद्यतन नहीं करना पड़ता है। (इसके अलावा, एआर का उपयोग करके हर जगह परिणाम में निहित डेटा तक पहुंचने का एक सतत तरीका है, अगर परिणाम पंक्ति एक ऑब्जेक्ट या सरणी है तो चिंता करने के बिना ...) – DCoder

+0

आपका पॉइंट प्राप्त हुआ। स्पष्टीकरण के लिए thanx। – itachi

1

आप अपने पृष्ठ पर सीधे लॉगिन देख सकते हैं:

'log'=>array(
    'class'=>'CLogRouter', 
    'routes'=>array(
     array(
      'class'=>'CWebLogRoute', 
     ), 
    ), 
), 
4

आप इस तरह, CDbCommandBuilder का उपयोग करके एसक्यूएल प्राप्त कर सकते हैं:

ModelClassName::model()-> getCommandBuilder()-> createFindCommand('tableName', $criteria)->text;

+1

यह सरल प्रश्नों के लिए एक अच्छा समाधान है, लेकिन यह ["साथ" पर विचार नहीं करता है] (https://github.com/yiisoft/yii/blob/1.1.16/framework/db/schema/CDbCommandBuilder.php#L74) जिसे ओपी के उदाहरण – Motin

0

आप तो SQL को देखने से पहले क्वेरी निष्पादित नहीं करना चाहते हैं, यह वास्तव में उतना आसान नहीं है जितना आप उम्मीद कर सकते हैं।

यह गलत के रूप में गंदा है, लेकिन जब केवल विकास में, मैंने पूर्व में मानदंडों में जानबूझकर एक जानबूझकर त्रुटि जोड़ने और SQL प्रयास करने के लिए परिणामस्वरूप अपवाद पर भरोसा करने के लिए लिया है।

उदा

$criteria = new CDbCriteria(); 
$criteria->condition = 't.date_fgjhfgjfgj BETWEEN :from_date AND :to_date'; 
$criteria->params = array(
    ':from_date' => $from_date, 
    ':to_date' => $to_date, 
); 
$criteria->with = array('order'); 
$orders = ProductOrder::model()->findAll($criteria); 

मैं इल्या की विधि पाया है अविश्वसनीय होने के लिए (क्यों पता नहीं, लेकिन कभी कभी मापदंड इस पद्धति का उपयोग को नजरअंदाज कर दिया जाता है)।

5
  • सबसे पहले जिस तरह से (आधिकारिक रास्ता):
    अपने main.php कॉन्फ़िग फ़ाइल में अपने log section में ये दोनों पैरामीटर जोड़ और आप अपने पृष्ठ या आपके ब्राउज़र में FireBug Console के अंत में संदेशों के लिए लॉग इन देख सकते हैं। db अनुभाग में आवश्यक पैरामीटर सेट करना न भूलें।

    'components' => array( 'db'=>array( 'enableProfiling'=>true, 'enableParamLogging' => true, ), 'log'=>array( 'class'=>'CLogRouter', 'routes'=>array( array( 'class'=>'CWebLogRoute', 'showInFireBug' => true, ), array( 'class'=>'CProfileLogRoute', 'levels'=>'profile', 'enabled'=>true, ), ), ), );

  • दूसरा तरीका:
    अपने कोड में बस कुछ गलत करने के लिए अपने स्तंभों में से एक की वर्तनी बदल सकते हैं और आपको एक त्रुटि संदेश मिल जाएगा अपने त्रुटि पृष्ठ में पूर्ण SQL क्वेरी शामिल (आपको चाहिए YII_DEBUG मोड में सत्य हो)।कुछ इस तरह:
    (मैं t.wrong_date करने के लिए t.date बदल गया है, जब आप अपने पेज को ताज़ा, आप उत्पन्न एसक्यूएल जो अपने डेटाबेस में मार डाला गया था देखेंगे)

$criteria = new CDbCriteria(); $criteria->condition = 't.wrong_date BETWEEN "'.$from_date.'" AND "'.$to_date.'"'; $criteria->with = array('order'); $orders = ProductOrder::model()->findAll($criteria);

दोनों तरीकों से, YII_DEBUGindex.php

में सत्य है
defined('YII_DEBUG') or define('YII_DEBUG',true); 
+1

में बताया गया था, मैं हमेशा दूसरे का उपयोग करता हूं – Xcoder