4
  $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();
  }

イベントモデルは、イベントのすべてのPOST変数とともに正しく保存されますが、パッケージには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,
    ));
  }
}
4

2 に答える 2

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'),何もしません(属性リストが空であるため)。

検証について詳しくはこちらをご覧ください

于 2012-10-02T23:19:01.613 に答える
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'
        );
      } 
      ....
    }

それが機能しない場合は、試してみてください。htereはvalidate()前のメソッドsave()です:

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

これにより、エラーとは何かがわかります。

直接保存しないでください。保存する前に検証してください。

于 2012-10-02T23:13:02.860 に答える