2013-05-10 137 views
0

沒有與beforeDelete功能下面的模型任務:beforeDelete功能不起作用

public function beforeDelete() 
{ 
    $model=Proposal::model()->findAllByAttributes(array('task_id'=>$this->id)); 
    $model->updateAll(array('task_id'=>null, 'task_result'=>null)); 
    parent::beforeDelete(); 
} 

正如你所看到的,我想從Proposal模型得到一些記錄(使用task_id場)和更新一些領域在排序的記錄。但是這段代碼不起作用 - 任務從任務表中刪除而不更新投標表中的字段。我該如何解決它?

更新:

$model=Proposal::model()->findAllByAttributes(array('task_id'=>$this->id)); 
foreach ($model as $proposal) 
{ 
    $proposal->task_id=null; 
    $proposal->task_result=null; 
    $proposal->update(); 
} 
parent::beforeDelete(); 

我剛剛更新了我的代碼,但它並沒有正常工作。

+1

這不應該在所有的工作 - 'findAll'返回一個數組,而不是一個對象,你也不會返回任何權限實際刪除記錄...刪除'findAllByAttributes'行,並將調整後的搜索條件作爲第二個參數傳遞給'updateAll'。 – DCoder 2013-05-10 15:33:09

+0

請看看更新 – user2218845 2013-05-10 15:49:23

回答

2

你應該簡單地嘗試(無需使用findAllByAttributes):

Proposal::model()->updateAll(
    array('task_id'=>null, 'task_result'=>null), 
    'task_id=:task_id', 
    array(':task_id'=>$this->id) 
); 
return parent::beforeDelete(); 

由於DCoder說,在其評論,這是最好的選擇。

Kevin Higgins在回答時表示,您應該返回parent::beforeDelete()

http://www.yiiframework.com/doc/api/1.1/CActiveRecord#updateAll-detail

或者如果你仍然想使用findAllByAttributes

$models = Proposal::model()->findAllByAttributes(array('task_id'=>$this->id)); 
foreach ($models as $proposal) 
{ 
    $proposal->update(array('task_id'=>null, 'task_result'=>null)); 
} 
return parent::beforeDelete(); 

http://www.yiiframework.com/doc/api/1.1/CActiveRecord#update-detail

或者

$models = Proposal::model()->findAllByAttributes(array('task_id'=>$this->id)); 
foreach ($models as $proposal) 
{ 
    $proposal->task_id=null; 
    $proposal->task_result=null; 
    $proposal->save(); 
} 
return parent::beforeDelete(); 

http://www.yiiframework.com/doc/api/1.1/CActiveRecord#save-detail

+1

值得注意的是,前兩個選項比第三個更昂貴。 1查詢獲取記錄加N個查詢來更新它們,而不是第三種情況下使用的查詢。 – DCoder 2013-05-11 11:29:28

+0

當然,我應該提到這一點,謝謝。更新答覆(重新排序)。 – soju 2013-05-11 12:28:59

1

除了原來的刪除代碼是錯誤的,你應該返回)母公司:: beforeDelete的結果(;

你的代碼看起來應該像這樣(用燒酒的第三項建議):

public function beforeDelete() 
{ 
    Proposal::model()->updateAll(
     array('task_id'=>null, 'task_result'=>null), 
     'task_id=:task_id', 
     array(':task_id'=>$this->id) 
    ); 
    return parent::beforeDelete(); 
}