2017-05-08 61 views
4

我想返回不同的領域取決於情況。我如何在dataProvider中設置它?Yii2。如何在dataProvider中設置場景?

$query = User::find(); 
$activeData = new ActiveDataProvider([ 
    'query' => $query, 
    'pagination' => [ 
     'pageSize' => 10, 
    ], 
]); 

字段在用戶模式:

public function fields() 
{ 
    if ($this->scenario == 'statistics') { 
     return [ 
      'id', 
      'email', 
      'count' 
     ]; 
    } 
    return [ 
     'id', 
     'name' 
    ]; 
} 
+0

你的意思是在SQL字段(列)或可能在某種程度上要使用模擬的情景「田」之類,也就是確認和分配的Yii 2的機制? – Bizley

+0

@Bizley不,沒有驗證。我已經更新了我的問題,請參閱示例。 –

+0

你是如何返回這些數據的?這是否適用於某些網格,如小部件? – Bizley

回答

1

有關使用$select性質是什麼?

$query = User::find()->select(['id','email','count']); 
$activeData = new ActiveDataProvider([ 
    'query' => $query, 
    'pagination' => [ 
     'pageSize' => 10, 
    ], 
]); 

甚至更​​好,創建一個ActiveQuery類爲他們:

class UserQuery extends ActiveQuery 
{ 
    public function statistics() 
    { 
     return $this->select(['id','email','count']); 
    } 

    /* add as many filtering functions as you need here */ 
} 

然後重寫find()方法在User類使用它:

public static function find() 
{ 
    return new \app\models\UserQuery(get_called_class()); 
} 

然後做:

$activeData = new ActiveDataProvider([ 
    'query' => User::find()->statistics(), 
    'pagination' => [ 
     'pageSize' => 10, 
    ], 
]); 

注:在Yii2的RESTful API,您也可以選擇網址中所需的字段的默認實現做:GET /users?fields=id,email,count

+1

你也可以重寫ActiveQuery中的'populate()'方法來在AR模型上設置一些屬性。 – cebe

0

使用getModels()方法簡單地讓所有的模型,設置情景對所有的人都在循環,然後返回數據提供者。你的榜樣將變成下面的代碼:

$query = User::find(); 
$activeData = new ActiveDataProvider([ 
    'query' => $query, 
    'pagination' => [ 
     'pageSize' => 10, 
    ], 
]); 
foreach($activeData->getModels() as $model) { 
    $model->scenario = 'statistics'; 
} 
return $activeData;