2017-05-08 113 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;