yii没有保存模型

时间:2012-10-02 22:43:18

标签: php yii

  $model=new Event('create');
  $model->attributes=$_POST['Event'];
  if($model->save()){
    $pkg = new Package(); 
    $pkg->attributes=$_POST['Package'];
    $pkg->event_id = $model->id;
    $pkg->save();
  }

事件模型使用Event的所有POST变量正确保存,而Package只设置了event_id,但没有设置任何属性(它们都是NULL)。我做错了什么?

注意:Event对象已由我的前任编程,Package对象是我做的新增加。

编辑:整个包类

  class Package extends CActiveRecord
  { 
  public static function model($className=__CLASS__)
  {
    return parent::model($className);
  }
public function tableName()
  {
    return 'tbl_package';
  }
 public function rules()
  {
    // NOTE: you should only define rules for those attributes that
    // will receive user inputs.
    return array(
      // The following rule is used by search().
      // Please remove those attributes that should not be searched.
      array('', 'safe', 'on'=>'search'),
      array('', 'numerical'),
    );
  }public function relations()
  {
    // NOTE: you may need to adjust the relation name and the related
    // class name for the relations automatically generated below.
    return array(
      'event' => array(self::BELONGS_TO, 'Event', 'id')
    );
  }public function attributeLabels()
  {
    return array(
      'event_id'      => 'Event ID',
      'package_name'  => 'Package name',
      'event_banner'  => 'Event Banner',
      'ad_placement'  => 'Ad Placement in Event Program',
      'logo_on_step'  => 'Logo on Step & Repeat',
      'use_evt_pics'  => 'Usage of Event Pictures',
      'exhibition'    => 'Exhibition Booth/Space',
      'inc_press'     => 'Inclusion in Press',
      'print_ads'     => 'Insertion in Print Ads',
      'online_ads'    => 'Insertion in Online Ads',
      'attendee_bags' => 'Attendee Bags',
      'charging_st'   => 'Charging Stations',
      'cups'          => 'Coffee/Water Cups',
      'distr_items'   => 'Distributable Items',
      'lanyards'      => 'Lanyards',
      'napkins'       => 'Napkins',
      'notebooks'     => 'Notebooks',
      'pens'          => 'Pens',
      'seat_covers'   => 'Seat Covers',
      'snack_pack'    => 'Snack Packaging',
      'water_bottles' => 'Water Bottles'
    );
  } public function search()
  {
    // Warning: Please modify the following code to remove attributes that
    // should not be searched.

    $criteria=new CDbCriteria;
    $criteria->compare('event_banner',$this->event_banner);
    $criteria->compare('package_name',$this->package_name);
    $criteria->compare('ad_placement',$this->ad_placement);
    $criteria->compare('logo_on_step',$this->logo_on_step);
    $criteria->compare('use_evt_pics',$this->use_evt_pics);
    $criteria->compare('exhibition',$this->exhibition);
    $criteria->compare('inc_press',$this->inc_press);
    $criteria->compare('print_ads',$this->print_ads);
    $criteria->compare('online_ads',$this->online_ads);
    $criteria->compare('attendee_bags',$this->attendee_bags);
    $criteria->compare('charging_st',$this->charging_st);
    $criteria->compare('cups',$this->cups);
    $criteria->compare('distr_items',$this->distr_items);
    $criteria->compare('lanyards',$this->lanyards);
    $criteria->compare('napkins',$this->napkins);
    $criteria->compare('notebooks',$this->notebooks);
    $criteria->compare('pens',$this->pens);
    $criteria->compare('seat_covers',$this->seat_covers);
    $criteria->compare('snack_pack',$this->snack_pack);
    $criteria->compare('water_bottles',$this->water_bottles);

    return new CActiveDataProvider('SponsorshipPackage', array(
      'criteria'=>$criteria,
    ));
  }
}

2 个答案:

答案 0 :(得分:9)

如果您想通过以下方式设置属性:

$pkg->attributes=$_POST['Package'];

然后你必须为可以这种方式设置的任何属性设置规则。

你需要这样的东西:

public function rules()
{
    // NOTE: you should only define rules for those attributes that
    // will receive user inputs.
    return array(
        array('package_name', 'required'),
        array('package_name', 'length', 'max' => 255),
        // or
        array('package_name', 'length', 'max' => 255, 'on' => 'insert'),
        // at least (when no validation is required):
        array('package_name', 'safe'),
        // ...
        // and so on.. 
    );
}

您需要使用此方式设置的任何属性的规则。

如果没有为属性设置规则,您只能通过$pkg->attribute_name = $value;

设置其值

array('', 'safe', 'on'=>'search'),array('', 'numerical'),之类的规则不执行任何操作(原因属性列表为空)。

详细了解验证here

答案 1 :(得分:1)

        class Package extends CActiveRecord
      { 
      public static function model($className=__CLASS__)
      {
        return parent::model($className);
      }
    public function tableName()
      {
        return 'tbl_package';
      }
     public function rules()
      {
        // NOTE: you should only define rules for those attributes that
        // will receive user inputs.
        return array(
          // The following rule is used by search().
          // Please remove those attributes that should not be searched.
          array('ad_placement, logo_on_step, ...', 'safe', 'on'=>'search'), //note put here all attrs name that you feel those attrs needs to be assigned from POST like: `$pkg->attributes=$_POST['Package'];`
array('event_id', 'numerical'),

        );
      }public function relations()
      {
        // NOTE: you may need to adjust the relation name and the related
        // class name for the relations automatically generated below.
        return array(
          'event' => array(self::BELONGS_TO, 'Event', 'id')
        );
      }public function attributeLabels()
      {
        return array(
          'event_id'      => 'Event ID',
          'package_name'  => 'Package name',
          'event_banner'  => 'Event Banner',
          'ad_placement'  => 'Ad Placement in Event Program',
          'logo_on_step'  => 'Logo on Step & Repeat',
          'use_evt_pics'  => 'Usage of Event Pictures',
          'exhibition'    => 'Exhibition Booth/Space',
          'inc_press'     => 'Inclusion in Press',
          'print_ads'     => 'Insertion in Print Ads',
          'online_ads'    => 'Insertion in Online Ads',
          'attendee_bags' => 'Attendee Bags',
          'charging_st'   => 'Charging Stations',
          'cups'          => 'Coffee/Water Cups',
          'distr_items'   => 'Distributable Items',
          'lanyards'      => 'Lanyards',
          'napkins'       => 'Napkins',
          'notebooks'     => 'Notebooks',
          'pens'          => 'Pens',
          'seat_covers'   => 'Seat Covers',
          'snack_pack'    => 'Snack Packaging',
          'water_bottles' => 'Water Bottles'
        );
      } 
      ....
    }

如果它不起作用,那么您可以尝试,validate()之前有save()方法:

  $model=new Event('create');
  $model->attributes=$_POST['Event'];
  if($model->validate()){
    $model->save();
  }
  else{
      echo CHtml::errorSummary($model);
  }

这将告诉什么是错误。

永远不要直接保存,在保存前验证它。