Итак, у меня есть модель site(#id, name, start_date, end_date)
, которая может быть в pause(#id, site_id, start_date, end_date)
, и я хочу отслеживать паузы.
Я начал с добавления кнопки расширения в CRUD сайта, чтобы иметь возможность добавлять/удалять паузы. Работает как шарм.
Но теперь я хотел бы знать непосредственно в списке сайтов состояние каждого. Итак, я начал с добавления нового поля выражения и просто проверил, работает ли сайт или нет:
$this->addExpression('state')->set('if(site.end_date IS NULL,"In Progress", if(now() < site.end_date, "In Progress", "Ended"))');
Работает отлично! Но теперь я не могу придумать способ определить, находится ли сайт в паузе или нет, и на самом деле я не могу воспроизвести результат выше, используя addExpression()->set(function($m, $q) {});
Редактировать:
Таким образом, пример, приведенный DarkSide, работает как шарм, но теперь мне нужно смешать два результата в единственном поле state
:
$this->addExpression('state')->set(function($model, $select)
{
// Is it ended ?
$ended = $select->expr('if(site.date_ended IS NULL,"In Progress", if(now() < site.date_ended, "In Progress", "Ended"))');
// Is it in pause ?
$paused = $model->refSQL('Site_Pause')
->count()
->where('date_started', '<', $select->expr('now()'))
->where('date_ended', '>', $select->expr('now()'));
if ($paused > 0)
return 'paused';
return $ended;
});
Поскольку $model->refSQL() возвращает объект DSQL, я не могу использовать операторы if
. Должен ли я попытаться сделать однократный SQL-запрос или попробовать, как указано выше, использовать операторы if
, получив результаты из объекта Dsql?