2013-04-02 97 views
1

我試圖將新行保存到報價中,但Yii不保存QuoteRow。它只保存新的服務(是的,DB結構有點奇怪)。我似乎無法弄清楚。如果該行沒有保存,$ qr-> save()應該返回false,但不會。該服務成功插入,但quoterow不是。新記錄沒有保存,也沒有錯誤信息

$service = new Services; 
$service->label = $row['title'] ?: "Övrigt"; 
$service->is_priced_per_unit = 1; 
$service->price_per_unit = $row['price']*0.8; 
$service->is_default = 0; 
$service->rot_deductable = (int)isset($row['rot']); 
$service->rot_deduction_percentage = 0.5; 
if (!$service->save()) $this->addError('Kunde inte spara raden',$service->getErrors()); 
    else{ 
    $qr = new QuoteRows; 
    $qr->quote_service_id = Yii::app()->db->getLastInsertID(); 
    $qr->quote_id = $id; 
    $qr->unit_size = $row['amount'] ?: 0; 
    $qr->raw_price = $row['price']*0.8*($row['amount'] ?: 1); 
    $qr->is_rot_deductable = isset($row['rot']) ? 1 : 0; 
    $qr->is_active = 1; 

    if (!$qr->save()) $this->addError('Kunde inte spara raden',$qr->getErrors()); 
} 

如果$ qr沒有保存,我應該得到錯誤。我也嘗試使用驗證函數驗證$ qr,並聲明它非常有效!

+0

僅僅因爲它通過Yii的驗證並不意味着插入時沒有mysql錯誤。你有沒有檢查你的錯誤日誌?您是否啓用了調試模式? – Pitchinnate

+0

Pitchinnate - 是否意味着save()會隱藏一個SQL錯誤? – grantwparks

回答

1

要麼使用調試模式,要麼在模型中使用beforeValidate,beforeSave方法和print_r($ model);

如果設置了所有屬性,則應保存新數據;明顯的東西不見了。

+0

我只是試着將ActiveRecord-part註釋掉,然後運行一個SQL查詢來獲得相同的結果。但是,如果我只是在我執行SQL查詢的部分確實沒有反應($ sql)',然後使用打印的SQL查詢並手動對我的數據庫運行它,它的工作原理很好... I從來沒有遇到過這樣的問題,它感覺就像db連接進入某種階段,根本沒有任何工作,並且日誌沒有顯示任何東西 –

+0

也許你的應用程序沒有連接到數據庫;它發生在我身上一次,我不知道如何,但我不得不強迫連接; 'Yii :: app() - > db-> getLastInsertID();'可能無法正常工作;許多事情可能發生在數據庫上 –

1

我有同樣的問題,但我忘記了beforSave方法。它返回了錯誤,但我沒有設置任何錯誤。所以getErrors方法的返回數組是空的。

1

確保您beforeSave,afterSave函數返回true

0

您正在使用兩種模式在同一個控制器。在'服務模型'中公開將'QuoteRows'中的所有字段公開地導入到'Services'中是更好的。同時使用POST方法保存值並通過QuoteRows模型保存。您也可以在「服務模型」中添加驗證條件。

0

您可能在模型中使用了一個不返回true的事件。例如。 public function beforeSave() {....... return true;//must return true after everything}