2016-04-06 152 views
0

我有两个表:Yii2排序计算字段

订单:

- id 
- client 
- ... 

线:

- orderID 
- startDate 
- endDate 
- ... 

我的订单控制我将这两得到来自每个订单行的日期:

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

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

在我的索引视图(使用卡尔蒂克的网格和expandRowColumn)我展示订单网格2计算列:

  • 起始日期:被越早开始从行日期为每个订单
  • END_DATE:从线得到更高结束日期每个订单
<?= 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'], 
     ], 
    ]); ?> 

如何设置OrdersSearch模型以允许使用这些值进行排序(start_Date和end_Date)?

回答

1

我认为你应该创建ActiveDataProvider在ActiveQuery使用连接,使用排序参数传递给动作:

$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

谢谢@法布里奇奥 - caldarelli。试图按照下面的代码,但是当我点击结束日期或开始日期以列表排序列表它只显示一个记录,而不是按日期排序的所有记录: $ sort = \ Yii :: $ app-> request->得到( '排序');如果(strpos($ sort,'start_Date')!== false)$ having ='MAX(startDate)';如果(strpos($ sort,'end_Date')!== false)$ having ='MAX(endDate)'; 如果(isset($具有)){ \t \t \t \t $查询=订单::寻找() - > joinWith([ 'ordersLines'=>功能($ q)的使用($具有){ \t \t \t \t \t $ q-> having = $ having; \t \t \t \t}]); \t \t \t} \t \t \t else $ query = Orders :: find(); – farrusete