2014-01-30 148 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

相關問題