2012-03-27 7 views
0

Gibt es eine Möglichkeit, die Zeichenfolgendarstellung der Abfrage von CDbCriteria abzurufen? Zum Testen und Debuggen.Abrufen der Zeichenfolgendarstellung von CDbCriteria

+0

'CDbCriteria' aggregiert nicht genügend Informationen, um eine vollständige Abfrage zu erstellen. Die Modellklasse enthält außerdem eine erhebliche Menge relevanter Informationen, sodass Sie beide berücksichtigen müssen. – Jon

Antwort

4

Sie können die Protokollierung und Profilierung nutzen Ihre main.php wie folgt konfigurieren:

'components'=>array(
    'log'=>array(
     'class'=>'CLogRouter', 
     'routes'=>array(
      array(
       'class'=>'CWebLogRoute', 
       'categories'=>'system.db.CDbCommand', 
       'showInFireBug'=>true, 
      ), 
     ), 
    ), 
    'db'=>array(
     'enableProfiling'=>true, 
     'enableParamLogging'=>true, 
    ),    
), 
+0

Ok, wenn ich die Zeilen mit enableProfiling, enableParamLogging und showInFireBug (das waren die einzigen in meiner Konfiguration, die fehlten) hinzugefügt habe, wie bekomme ich die SQL? Ich erwarte, dass die FireBug-Einstellung die SQL-Show in FireBug zeigt, richtig? –

+0

Ja, soweit ich mich erinnere. – Puigcerber

+0

Puigcerber, ich kann einfach nichts bekommen, um meine lokale Instanz auf meinem Windows 7-Rechner anzumelden. Wo in Firebug sollte ich das in der Registerkarte Konsole sehen? Wenn es nicht da ist, wo soll ich hingehen? Um die sql zu sehen, ist es erforderlich, etwas wie Log.Debug ($ criteria) zu machen, damit ich etwas sehe? –

1

Ich gebe die Antwort auf diese Frage für die Suche, viel viel Zeit, so dachte er, mit euch zu teilen. Hoffe das spart Ihre kostbare Zeit.

Wie von Jon oben erwähnt: CDbCriteria nicht genug Informationen zusammen, um die vollständige Abfrage zu erstellen, müssen Sie die Modellklasseninformationen auch auf denen Sie die Abfrage Einschränkungen setzen.

Als Beispiel in Yii docs für CDbCriteria; dies ist, wie im Grunde Sie it-

$criteria=new CDbCriteria(); 
$criteria->compare('status',Post::STATUS_ACTIVE); 
$criteria->addInCondition('id',array(1,2,3,4,5,6)); 

$posts = Post::model()->findAll($criteria); 

Hier Post ist der Name des Modells verwenden, auf dem Sie die Abfragebedingung auszuführen.

Wenn Sie also die Textdarstellung der in CDbCriteria geschriebenen Abfrage abrufen möchten, müssen Sie die Modellinformationen, d. H. Post, einbeziehen. Diese

ist, wie Sie es tun können -

$model = new Post(); 
$query = $model->getCommandBuilder()->createFindCommand($model->getTableSchema(), $criteria)->getText(); 

Wenn Sie den Wert in $query Variable drucken es die rohe Abfrage druckt.

Hoffe, das hilft.

+0

Große Antwort und besser als die Protokolleinstellungen zu ändern. Das einzige Problem mit der letzten Abfrage ist, dass es immer noch die Platzhalter enthält, z. B. ": productId". – niekoost