使用另一个表中的数据添加计算字段

时间:2014-01-30 13:53:51

标签: atk4

所以我有一个模型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语句?

2 个答案:

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