2016-08-18 8 views
0

Ich habe einen Online-Shop mit dynamischen Feldern (Spezifikationen) und Filtern. Alle Angaben sind in der Tabelle gespeichert sind z.BYii2 dynamisch hinzufügen joinWith

product_specifications: 
-id 
-product_id 
-spec_id 
-spec_val_id 

Filter sind mit Daten verbunden sind, so dass, wenn i Filterwert senden i Spezifikationswerte. Zum Beispiel

Wenn ich Schleifenfilter bin, möchte ich linken Verknüpfungen zur Produktabfrage hinzufügen. So etwas wie dieses

$joinString = ""; 
foreach($filters){ 
$joinString .= "LEFT JOIN product_specifications AS prod_'.filter.' ON ....."; 
} 

Ich habe Abfrage so ActiveDataProvider:

$prodQuery = Product::find()->joinWith('translation')->joinWith('cats')->[HERE FILTERS JOINS]->where($whereString)->groupBy(['id']); 

Aber wenn ich 5 Filter haben, ich brauche 5 schließt sich an Tisch product_specifications. Kann ich in joinWith ein Array mit allen Joins hinzufügen oder 5 Joins zur Abfragekette hinzufügen? Zu einer Kategorie meine Filter sind auch dynamisch, so dass die Seite 5 oder 10 Filter haben kann, kann ich keine statische Anzahl von joinWith ('specs') hinzufügen.

Vielen Dank im Voraus.

Ich bin auch mit anderen Entscheidungen einverstanden.

EDIT:

ich Abfrage mit findBySql wie diese

ändern
$prodQuery = Product::findBySql(' 
       SELECT `product`.* 
       FROM `product` 
       LEFT JOIN `productLang` ON `product`.`id` = `productLang`.`product_id` 
       LEFT JOIN `product_cat` ON `product`.`id` = `product_cat`.`product_id` 
       LEFT JOIN `page` ON `product_cat`.`page_id` = `page`.`id` 
       LEFT JOIN `page` `parent` ON `page`.`id_in` = `parent`.`id`' 
       .$joinString. 
       ' WHERE (' 
        .$whereString. 
        ' AND (`language`=\''.$lang->url.'\')) GROUP BY `product`.`id` '); 

Und mein Dataprovider:

$dataProvider = new ActiveDataProvider([ 
       'query' => $prodQuery, 
       'pagination' => [ 
        'totalCount' => count($prodQuery->all()), 
        'pageSize' => $pageSize, 
        'route' => Yii::$app->getRequest()->getQueryParam('first_step'), 
       ], 
       'sort' => [ 
        'defaultOrder' => $orderArr, 
       ], 
      ]); 

Nun mein Problem Paginierung ist und Sortierung. In meiner Testseite habe ich 4 Produkte, wenn ich $ pageSize = 1 setze, habe ich 4 Seiten in Paginierung, aber auf jeder Seite habe ich alle 4 Produkte.

Wo ist mein Fehler?

Antwort

0

sein Können Sie andFilterWhere verwenden können (wenn der Wert null keine ist, wo codntion hinzugefügt wird, da sonst die und wo hinzugefügt wird)

$prodQuery = Product::find()->joinWith('translation')->joinWith('cats')->where($whereString)->groupBy(['id']); 


$prodQuery->andFilterWhere(['attribute1' => $value1]) 
      ->andFilterWhere(['attribute2' => $value2]) 
      ->andFilterWhere(['attribute3' => $value3]) 
      ->andFilterWhere(['attribute4' => $value4]) 
      ->andFilterWhere(['attribute5' => $value5]) 
+0

Mein Problem ist nicht, wo Zustand. Es ist in meinem var $ whereString. Wenn ich Schleifenfilter, wo Bedingung für Filter in $ whereString verkettet ist, aber ich kann nicht alle Verknüpfungen verketten. Zum Beispiel habe ich 2 Filter, ich brauche 2 Links Joins z. B. LINKEN JOIN product_spec als prod_spec_1 ON .... LINKS JOIN product_spec als prod_spec_2, so in meinem wo Zustand habe ich prod_spec_1.spec_id = filterValue1 UND prod_spec_2.spec_id = filterValue2 – pLe0mAx