2013-04-02 81 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}