2016-09-28 3 views
2

관련 테이블이 , order_product (order_id, product_id, quantity, product_price)product입니다. select SUM(p.quantity*p.product_price) 같이 total from order_product p GROUP by order_id 으로 계산하거나 hasmany로 쉽게 얻을 수있는 주문한 제품 수를 사용하여 주문 모델을 표시 할 수있는 yii2 격자보기를 사용하고 있습니다. 내 문제는 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 열 '에 대한 조항'모호합니다 실행되고있는 SQL은 다음과 같다 : SELECT COUNT (*) from order 'LEFT JOIN'customer' on'order'.customer_id' ='customer'.'id' LEFT JOIN (SELECT'order_id', SUM (quantity * product_price) '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