Yii2 жадная загрузка для вычисляемых/агрегируемых полей


Warning: Use of undefined constant videoembedder_options - assumed 'videoembedder_options' (this will throw an Error in a future version of PHP) in /home/devintru22/data/www/devint.ru/wp-content/plugins/video-embedder/video-embedder.php on line 306
// https://github.com/yiisoft/yii2/blob/34aeb019e51978f8f9982d9dd8bd3ed8798e7217/docs/guide-ru/db-active-record.md
class Customer extends \yii\db\ActiveRecord
{
/**
* Объявляет виртуальное свойство для агрегируемых данных, доступное только на чтение.
*/
public function getOrdersCount()
{
if ($this->isNewRecord) {
return null; // нет смысла выполнять запрос на поиск по пустым ключам
}

return $this->ordersAggregation[0]['counted'];
}

/**
* Объявляет обычное отношение 'orders'.
*/
public function getOrders()
{
return $this->hasMany(Order::className(), ['customer_id' => 'id']);
}

/**
* Объявляет новое отношение, основанное на 'orders', которое предоставляет агрегацию.
*/
public function getOrdersAggregation()
{
return $this->getOrders()
->select(['customer_id', 'counted' => 'count(*)'])
->groupBy('customer_id')
->asArray(true);
}

// ...
}

foreach (Customer::find()->with('ordersAggregation')->all() as $customer) {
echo $customer->ordersCount; // выводит агрегируемые данные из отношения без дополнительного запроса благодаря жадной загрузке
}

$customer = Customer::findOne($pk);
$customer->ordersCount; // выводит агрегируемые данные отношения через ленивую загрузку

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *