2016-04-06 14 views
0

Ich habe zwei Tabellen:Yii2 Sortieren nach berechnetem Feld

Aufträge:

- id 
- client 
- ... 

Linien:

- orderID 
- startDate 
- endDate 
- ... 

In meinem Befehl Controller ich diese beide hinzugefügt zu bekommen Daten von jeder Bestellzeile:

public function getStartDate() 
    { 
     return OrdersLines::find() 
     ->andWhere(['orderID'=>$this->id]) 
     ->min('startDate'); 
    } 

    public function getEndDate() 
    {   
     return OrdersLines::find() 
     ->andWhere(['orderID'=>$this->id]) 
     ->max('endDate'); 
    } 

In meiner Index-Ansicht (mit kartik des Gitter und expandRowColumn) zeige, dass ich die Aufträge Gitter mit 2 berechneten Spalten:

  • start_date: wird das frühe Datum Linien für jeden Auftrag
  • end_date starten: bekommt die höhere Enddatum von Linien für jeden Auftrag
<?= GridView::widget([ 
     'dataProvider' => $dataProvider, 
     'filterModel' => $searchModel, 
     'export' => false, 
     'columns' => [ 
      [ 
       'class'   => 'kartik\grid\ExpandRowColumn', 
       'value'   => function ($model, $key, $index, $column) { 
        return GridView::ROW_COLLAPSED; 
       }, 
       'detail'  => function ($model, $key, $index, $column) { 
        $searchModel = new OrdersLinesSearch(); 
        $searchModel->orderID = $model->id; 
        $dataProvider = $searchModel->search(Yii::$app->request->queryParams); 

        return Yii::$app->controller->renderPartial('_ordersLines', [ 
         'searchModel' => $searchModel, 
         'dataProvider' => $dataProvider, 
        ]); 
       }, 
      ], 
      ...    
      [ 
       'attribute' => 'start_Date', 
       'format' => 'date', 
       'label' => 'Start Date', 
       'value' => 'startDate', 

      ], 
      [ 
       'attribute' => 'end_Date', 
       'format' => 'date', 
       'label' => 'End Date', 
       'value' => 'endDate', 
      ], 

      ['class' => 'yii\grid\ActionColumn'], 
     ], 
    ]); ?> 

Wie kann ich das OrderSearch-Modell so einstellen, dass die Sortierung nach diesen Werten möglich ist (start_Date und end_Date)?

Antwort

1

denke ich, dass Sie erstellen, sollten ActiveDataProvider in ActiveQuery verbinden verwenden, mit Sortierparameter zur Aktion übergeben:

$sort = \Yii::$app->request->get('sort'); 

if($sort == 'startDate') $having = 'MAX(startDate)'; 
if($sort == 'endDate') $having = 'MAX(endDate)'; 

$sql = Orders::find()->joinWith(['lines' => function($q) use($having) { 
    $q->having = $having; 
}]); 
+0

danke @ fabrizio-Caldarelli. Versuchte das unten Code, aber wenn ich sowohl am Enddatum als auch am Anfangsdatum klicke, um die Liste zu sortieren, zeigt es nur einen Datensatz anstelle aller nach Datum sortierten Datensätze an: $ sort = \ Yii :: $ app-> request-> bekommen ('sortieren'); \t \t if (strpos ($ sort, 'start_Datum')! == false) $ having = 'MAX (startDate)'; \t \t if (strpos ($ sort, 'end_Date')! == falsch) $ having = 'MAX (endDate)'; if (isset ($ mit)) { \t \t \t \t $ query = :: Orders finden() -> joinWith ([ 'ordersLines' => function ($ q) verwenden (mit $) { \t \t \t \t \t $ q-> haben = $ haben; \t \t \t \t}]); \t \t \t \t \t sonst $ query = Aufträge :: find(); – farrusete

Verwandte Themen