2015-05-12 15 views
11

Ich bin relativ neu zu Yii.Yii fügen Sie eine weitere zu CDbCriteria

Ich war zuversichtlich mit Raw SQL, aber immer noch ein bisschen verloren, wenn es ORM kommt. Das ist also eine Scheinfrage.

Ich habe alle notwendigen Datensätze Bau einer solchen CDbCriteria Introduction:

$criteria = new CDbCriteria(array(
    'select' => 'sum(items) as items', 
    // 'condition' => 't.items > 0 and order.storage = "'Product::STORAGE_LOCAL . '"', 

    'condition' => 't.items > 0 and order.storage = "' . Product::STORAGE_LOCAL . '"', 
    'order' => 'sum(items) DESC', 
    'with' => array(
    'product' => array(
     'select' => 'code, title, producer, local_rest', 

     **// 'select' => 'code, title, producer, sum(local_rest) as local_rest',** 
     'group' => 'product.code', 
    ) 
), 

    'join' => 'inner join `order` `order` on `t`.`order_id` = `order`.`id`', 
    // 'group' => '`product`.`code`, `product`.`title`', 
    'group' => '`product`.`code`', 
    'together' => true 
)); 

Ich versuche Summe von local_rest Feld zu bekommen group by tun. Leider gibt es nicht zurück, was es sein sollte.

Dies ist, wie ich in es in CDbCriteria zu bauen versucht:

// 'select' => 'code, title, producer, sum(local_rest) as local_rest',. - kein Glück.

kann ich das es mit getrennten Abfrage erhalten:

$sum_local_rest = Yii::app()->db->createCommand(" 
    SELECT id,code, title, sum(local_rest) as sum_rest FROM product GROUP BY code 
    ORDER BY `sum_rest` DESC 
"); 

Eine weitere Vorsicht - es gibt doppelte Datensätze in Produkttabelle. I.e. Wir haben das gleiche Produkt mehr als einmal. Aber wenn ich GROUP BY verwende, hilft es, diesen Mangel zu begrenzen. Dies liegt an schlechtem DB-Design und sollte in Zukunft behoben werden.

Das Problem ist, dass ich es irgendwie zu binden, mit CDbCriteria, weil es von GridView verwendet verwendet wird durch CDataProvider und CDataProvider.

Irgendwelche Tipps, wie Sie diese beiden Fragen in einem CDbCriteria verbinden?

Vielen Dank im Voraus

EDIT

bei den aktuellen Antworten der Suche ich fühle ich mich zusammenfassen müssen. Das Hauptproblem ist, dass ich CDbCriteria mitteilen muss, um Aufzeichnungen zu erhalten (gebunden durch HAS_Many Verbindungen) und SUMME von allen diesen Aufzeichnungen zu berechnen und CDbCriteria zu machen, um GROUP BY dieser Aufzeichnungen zu tun. Kein anderer Weg. Ich kann das nicht explizit machen. Weil ich CDbCriteria an CDataProvider überlasse und es Abfragen ausführen sollte. So funktionieren die Dinge in Yii (so weit ich es verstehe).

+0

haben Sie versucht, mit Array ("Spalte1", "Spalte2") auswählen? http://www.yiiframework.com/doc/api/1.1/CDbCriteria#select-detail –

+0

Überprüfen Sie auch diesen Link http://stackoverflow.com/a/12299137/3793566 und http://stackoverflow.com/a/ 16536633/3793566 –

+0

das Problem ist, ich brauche es aus verwandten Tabelle. – Tebe

Antwort

2

Sie müssen auch nicht alle Elemente Kriterien erfüllen. Versuchen Sie Kriterien in mehr Code wie folgt aufteilen:

$criteria = new CDbCriteria(); 
$criteria->select = 'sum(items) as items, ' . Product::STORAGE_LOCAL; 
$criteria->condition = 't.items > 0 and order.storage = ' . Product::STORAGE_LOCAL; 

//etc. 
+0

Ich bin mir nicht sicher, aber ich denke, die resultierende CDbCriteria wird das gleiche sein und obiger Code ist identisch mit $ criterure = new CDbCriteria (array ('select' => 'sum (items) als Items,'. Product :: STORAGE_LOCAL , 'condition' => 't.items> 0 und order.storage ='. Produkt :: STORAGE_LOCAL)); . Vielleicht ist das nur eine Frage des Geschmacks. – Tebe

3

//You can merge your criteria like here: 
 

 
$criteria = new CDbCriteria(); //First criteria 
 
$criteria_2 = new CDbCriteria(); //Second criteria 
 

 
$criteria->mergeWith($criteria_2); //Merge criteria and criteria_2 
 

 
SomeModel::model()->findAll($criteria); //Find by criteria

+0

Gute Idee. Obwohl ich nicht sehen kann, wie das Teilen hier helfen könnte, abgesehen davon, Code klarer zu machen. Weil ich findAll() nicht manuell aufrufen kann. CDataprovider macht es an meiner Stelle. – Tebe

+0

@AlexShulzhenko Sie müssen findAll() nicht verwenden, da CActiveDataProvider ein Kriterienobjekt als einen seiner Parameter akzeptiert. Da '$ criteria_2' in' $ criteria' zusammengeführt wurde, müssen Sie CActiveDataProvider nur übergeben, um die Bedingungen beider Objekte zu übernehmen. – ethan

3

Ich sehe nicht, warum so etwas nicht funktionieren sollte:

$criteria = new CDbCriteria; $criteria->select = array( "SUM(t.items) as items", "SUM(product.local_rest) as product_local_rest" ); $criteria->condition = "t.items > 0 and order.storage = "' . Product::STORAGE_LOCAL . '"'; $criteria->join = 'inner join `order` `order` on `t`.`order_id` = `order`.`id`'; $criteria->with = "product"; $criteria->group = "product.code"; $criteria->together = true;

Da Sie together auf true sind Einstellung, die Spalten Ihrer Beziehung sollten für Ihre Abfrage verfügbar sein und durch den Namen der Beziehung (Produkt) als Alias ​​angezeigt werden. (Hinweis: Um auf das Ergebnis von SUM (product.local_rest) auf den von CActiveDataProvider zurückgegebenen Modellen zuzugreifen, müssen Sie $product_local_rest als öffentliche Eigenschaft für die Klasse der zurückgegebenen Modelle festlegen.)

Wenn Sie lieber Raw-SQL schreiben möchten, können Sie alternativ CDbCommand verwenden, um ein Array mit Ergebnissen zu generieren, und dann CArrayDataProvider anstelle von CActiveDataProvider verwenden. http://www.yiiframework.com/doc/api/1.1/CArrayDataProvider

Verwandte Themen