所以我有一个模型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-&gt; refSQL()返回一个DSQL对象,我无法使用if
语句。我是否应该通过从Dsql对象获取结果来尝试进行一次性SQL查询或尝试使用if
语句?
答案 0 :(得分:0)
在Model_Site中:
错误示例:
我猜你可以在set()方法中将subselect中的所有内容添加为表达式,但这既不好也不可取。
$this->addExpression('paused')
->set("if( (SELECT 1 FROM pause WHERE pause.start_date<now() AND (pause.end_date IS NULL OR pause.end_date>now())), 'yes', 'no') ");
更好的例子:
$this->addExpression('paused')->set(function($m, $q){
return $m->refSQL('Pause') // Model_Pause
->where('start_date', '<', $q->expr('now()'))
->where('end_date', '>', $q->expr('now()')) // here you'll also need to use q->orExpr() to add case when end_date is null (see expression above in bad example)
->count()
;
);
你可以在我的Scheduler附加模型中看到这样的东西(在Model_Task中的last_status,last_run,next_status,next_run)。这是链接:https://github.com/DarkSide666/ds-addons/tree/master/Scheduler/lib/Model/Scheduler
请记住,上面的所有示例都是完全未经测试的,只是为了给您提供想法。
答案 1 :(得分:0)
好的,明白了!如果有人需要,我在这里发布解决方案:
$this->addExpression('etat')->set(function($model, $select)
{
return (
$select->expr(
'IF (
site.date_ended IS NULL OR NOW() < site.date_ended,
IF (
[f1] > 0,
"Paused",
"In Progress"
),
"Ended"
)'
)->setCustom('f1',
$model->refSQL('Site_Pause')
->count()
->where('date_started', '<', $select->expr('NOW()'))
->where('date_ended', '>', $select->expr('NOW()'))
)
);
});