php - orderby - Yii2: Ejemplo de ActiveQuery y ¿cuál es la razón para generar la clase ActiveQuery por separado en Gii?
yii2 expression where (1)
La consulta activa representa una consulta de base de datos asociada con una clase de registro activo . Por lo general, se usa para anular el método predeterminado find()
de un modelo específico donde se usará para generar la consulta antes de enviarla a la base de datos:
class OrderQuery extends ActiveQuery
{
public function payed()
{
return $this->andWhere([''status'' => 1]);
}
public function big($threshold = 100)
{
return $this->andWhere([''>'', ''subtotal'', $threshold]);
}
}
Si trabajaste antes con Yii 1, esto es lo que reemplaza a Yii 1.x Named Scopes en Yii2. Todo lo que tiene que hacer es anular el método find()
en su clase modelo para usar la clase ActiveQuery anterior:
// This will be auto generated by gii if ''Generate ActiveQuery'' is selected
public static function find()
{
return new /app/models/OrderQuery(get_called_class());
}
Entonces puedes usarlo de esta manera:
$payed_orders = Order::find()->payed()->all();
$very_big_orders = Order::find()->big(999)->all();
$big_payed_orders = Order::find()->big()->payed()->all();
Un caso de uso diferente de la misma clase de ActiveQuery definida anteriormente es usarlo al definir datos relacionales en una clase de modelo relacionada como:
class Customer extends /yii/db/ActiveRecord
{
...
public function getPayedOrders()
{
return $this->hasMany(Order::className(),[''customer_id'' => ''id''])->payed();
}
}
Luego, puede cargar clientes con sus respectivas órdenes pagadas haciendo:
$customers = Customer::find()->with(''payedOrders'')->all();