Делаю статистику для пользователя.
По дням, неделям, мес. год. все время и диапазон дат.
Есть три сущности, на которых все это завязано все они клеются один ко многим
Partner->Coupon->Order
В таблице купона есть partner_id
В таблице заказа есть partner_id, сoupon_id
Везде стоят даты создания в UNIX от поведения TimeStampBehavior
на контроллере под каждый период создан экшн. На фронте это просто кнопки.
За весь период я сделал следующим образом. получил id текущего партнера и вытащил все купоны принадлежащие ему. запихнул это в дата провайдер, а на фронтенде. сделал доп запрос по каунтам.
провайдер
<table class="table table-hover">
<tr>
<td><strong>Название купона</strong></td>
<td><strong>Покупок</strong></td>
</tr>
<?= \yii\widgets\ListView::widget([
'dataProvider' => $couponsProvider,
'itemView' => '_coupons',
]) ?>
</table>
непосредственно счетчик.
<?php
use yii\helpers\Html;
use yii\helpers\Markdown;
//получаем кол-во
$orders = \common\models\Order::find()->where(['coupon_id' => $model->id])->count(); ?>
<tr>
<td><?= Html::encode($model->title) ?></td>
<td><?= Html::encode($orders) ?></td>
</tr>
Собственно по датам я в метод count закладываю условия по дате. А до этого дату конвертирую подобным образом
$timestamp = time();
$dates = Yii::app()->dateFormatter->format('dd-MM-yyyy', $timestamp);
$date = new DateTime($dates);
$date->modify('-1 day');
$date_elements = explode("-",$date->format('d-m-Y'));
$beforeTime = mktime(0,0,0,$date_elements[1],$date_elements[0],$date_elements[2]);
И это получается, что +1 запрос на каждый купон. Купоны имеют статусы и в статистике архивные не учавствуют. По сути больше 10 товарных купонов не будет. Но все равно, написано костылями и я не знаю как это улучшить через провайдер или как вообще статистику будет правильнее реализовать? Учитывая сейчас то, что связи есть, но как-то использовать их я не могу поскольку получаем партнера, потом кучу его купонов, а потом все заказы по этим купонам.