2014-01-30 114 views
0

所以我有一个模型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"))');

完美的作品!但现在我不能想到的方法来确定该网站是否处于暂停或没有,事实上我不能reproduice以上使用结果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; 
}); 

至于$模型 - > refSQL()返回一个对象DSQL我不能使用的if语句。我应该尝试通过从Dsql对象中获取结果来进行一次全部SQL查询或尝试使用if语句吗?

回答

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()')) ) ); });

0

在Model_Site:

错误的例子:

我想你可以在子查询中集()方法表达添加的一切,但是这也不是太好,也不是可取的。

$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() 
     ; 
); 

像这样的事情,你可以在我的日程安排见附加模型(last_status,last_run,next_status,next_run在Model_Task)。这里是链接:https://github.com/DarkSide666/ds-addons/tree/master/Scheduler/lib/Model/Scheduler

请记住,所有上面的例子都是完全没有经过测试,这里只是给你想法。

+0

THX我更好地了解现在使用的$ m和$ Q,看编辑的问题,在最后一步,我想实现 – Sluggogle

+0

我想你应该尝试在一个SQL中完成所有操作,然后将其作为DSQL返回。您可以尝试将另一个DSQL注入另一个DSQL中作为子选择。也许这可以帮助。今晚我有点困了,想成为一个很好的例子:) – DarkSide

相关问题