2017-05-08 6 views
4

Ich möchte verschiedene Felder abhängig von Szenario zurückgeben. Wie kann ich es in DataProvider setzen?Yii2. Wie setze ich ein Szenario in DataProvider?

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

Felder in User-Modell:

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

Meinst du "Felder" wie in SQL-Feldern (Spalten) oder vielleicht möchten Sie Modell-Szenarien, das ist die Validierung und Zuordnung Yii 2 Mechanismus? – Bizley

+0

@Bizley Nein, nicht in Validierung. Ich habe meine Frage aktualisiert, siehe Beispiel. –

+0

Wie geben Sie diese Daten zurück? Ist das für ein Grid ähnliches Widget? – Bizley

Antwort

1

Was die $select Eigenschaft verwenden?

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

Oder noch besser, eine ActiveQuery Klasse für sich erstellen:

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

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

Dann überschreiben die find() Methode in der User Klasse, es zu benutzen:

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

Dann tun:

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

Hinweis: In Standardimplementierung von Yii2 RESTful API Sie auch die erforderlichen Felder innerhalb URL, indem Sie wählen: GET /users?fields=id,email,count die Modelle alle getModels() Methode, setzen Szenario in der Schleife für alle von ihnen mit

+1

Sie können auch die Methode 'populate()' in ActiveQuery überschreiben, um einige Eigenschaften für die AR-Modelle festzulegen. – cebe

0

einfach bekommen und dann Datenanbieter zurückgeben. Ihr Beispiel ändert sich in folgenden Code:

Verwandte Themen