web-dev-qa-db-fra.com

Yii2: Exemple ActiveQuery et quelle est la raison de générer séparément la classe ActiveQuery dans Gii?

Pourriez-vous fournir un exemple d'utilisation. La description sera très appréciée. Je ne peux pas en trouver un bon exemple.

ActiveQuery in Gii

33
akmnahid

Active Query représente une requête DB associée à une classe Active Record . Il est généralement utilisé pour remplacer la méthode par défaut find() d'un modèle spécifique où il sera utilisé pour générer la requête avant de l'envoyer à DB:

class OrderQuery extends ActiveQuery
{
     public function payed()
     {
        return $this->andWhere(['status' => 1]);
     }

     public function big($threshold = 100)
     {
        return $this->andWhere(['>', 'subtotal', $threshold]);
     }

}

Si vous avez travaillé auparavant avec Yii 1, c'est ce qui remplace Yii 1.x Named Scopes dans Yii2. Tout ce que vous avez à faire est de remplacer la fonction find() méthode dans votre classe modèle pour utiliser la classe ActiveQuery ci-dessus:

// This will be auto generated by gii if 'Generate ActiveQuery' is selected
public static function find()
{
    return new \app\models\OrderQuery(get_called_class());
}

Ensuite, vous pouvez l'utiliser de cette façon:

$payed_orders      =   Order::find()->payed()->all();

$very_big_orders   =   Order::find()->big(999)->all();

$big_payed_orders  =   Order::find()->big()->payed()->all();

Un cas d'utilisation différent de la même classe ActiveQuery définie ci-dessus consiste à l'utiliser lors de la définition des données relationnelles dans une classe modèle similaire comme:

class Customer extends \yii\db\ActiveRecord
{
    ...

    public function getPayedOrders()
    {
        return $this->hasMany(Order::className(),['customer_id' => 'id'])->payed();
    }
}

Ensuite, vous pouvez charger avec impatience clients avec leurs commandes payées respectives en faisant:

$customers = Customer::find()->with('payedOrders')->all(); 
81
Salem Ouerdani