2017-05-08 4 views
4

異なるフィールドを返す場合は、シナリオによって異なります。 dataProviderでどのように設定できますか? Userモデルで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 */ 
} 

そして、それを使用するUserクラスのfind()メソッドオーバーライドします。次に

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

行います

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

注:あなたもやってURL内の必要なフィールドを選択することができます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; 
関連する問題