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)?
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