2016-09-28 106 views
2

我有这些相关的表格:order,order_product (order_id, product_id, quantity, product_price)product。 我正在使用yii2网格视图来显示订单模型,它的总金额可以用sql计算,如 select SUM(p.quantity*p.product_price)作为total from order_product p GROUP by order_id 或者使用php getter和我可以用hasmany轻松获得的产品数量。 我的问题是gridview过滤器。 如何在gridview中设置搜索和这些列的排序?yii2 gridview过滤在第二个表列的计数/总和

+0

你到目前为止试过的还是细化了一下。 –

+0

试试这个[link](http://www.yiiframework.com/wiki/679/filter-sort-by-summary-data-in-gridview-yii-2-0/)或详细说明 – Mohan

+0

@Mohan谢谢你的答案,但我已经尝试过,它给了我一个完整性约束冲突,我无法在这里处理它是 “SQLSTATE [23000]:完整性约束冲突:1052列子句中的列'id'含糊 正在执行的SQL是:SELECT COUNT(*)FROM'order' LEFT JOIN'customer' ON'order'.'customer_id' ='customer'.'id' LEFT JOIN(SELECT'order_id',SUM(quantity * product_price) as total FROM'order_product' GROUP BY'order_id')'orderSum' ON orderSum.order_id = id“ – leila

回答

4

我找到了答案。

<?php 

namespace common\models; 

use Yii; 
use yii\base\Model; 
use yii\data\ActiveDataProvider; 
use common\models\Order; 
use common\models\OrderProduct; 
class OrderSearch extends Order 
{ 
    public $total; 
    public $nbProd; 
    public $client; 
    /** 
    * @inheritdoc 
    */ 
    public function rules() 
    { 
     return [ 
      [['total', 'nbProd', 'client'], 'safe'], 
      [['nbProd'], 'number'], 
      [['client'], 'string'], 
     ]; 
    } 
    public function search($params) 
    { 
     $query = Order::find(); 
     $query->joinWith(['customer']); 
     $subQuery = OrderProduct::find() 
     ->select('order_id, SUM(quantity*product_price) as total,    count(product_id) as nbProd') 
     ->groupBy('order_id'); 
     $query->leftJoin(['orderSum' => $subQuery], 'orderSum.order_id = order.id'); 
     $dataProvider = new ActiveDataProvider([ 
      'query' => $query, 
      'sort'=> ['defaultOrder' => ['id'=>SORT_DESC]], 
     ]); 
     $dataProvider->sort->attributes['client'] = [ 
      'asc' => ['customer.company' => SORT_ASC], 
      'desc' => ['customer.company' => SORT_DESC], 
     ]; 
     $dataProvider->sort->attributes['nbProd'] = [ 
      'asc' => ['orderSum.nbProd' => SORT_ASC], 
      'desc' => ['orderSum.nbProd' => SORT_DESC], 
     ]; 
     $dataProvider->sort->attributes['total'] = [ 
      'asc' => ['orderSum.total' => SORT_ASC], 
      'desc' => ['orderSum.total' => SORT_DESC], 
     ]; 

     $this->load($params); 

     if (!$this->validate()) { 
      return $dataProvider; 
     } 

     // grid filtering conditions 
     $query->andFilterWhere([ 
      'id' => $this->id, 
      'orderSum.total' => $this->total, 
      'orderSum.nbProd' => $this->nbProd, 
     ]); 

     $query->andFilterWhere(['like', 'customer.name', $this->client]); 

     return $dataProvider; 
    } 
} 
+0

谢谢v多!!! – mrateb