Yii простая реляционная задача - PullRequest
1 голос
/ 25 марта 2011

Я совершенно новичок в Yii Framework и реляционных базах данных, но мне нужно создать небольшое приложение для контроля партнеров и действий. Партнеры (соц.) Могут иметь много видов деятельности, а виды деятельности могут иметь много партнеров. Итак, вот моя база данных

 CREATE TABLE `actividades` (
   `id` int(11) NOT NULL,
   `nombre` varchar(45) NOT NULL,
   PRIMARY KEY (`id`)
 ) ENGINE=InnoDB DEFAULT CHARSET=latin1;

CREATE TABLE `axs` (
  `id_socio` int(11) NOT NULL,
  `id_acti` int(11) NOT NULL,
  KEY `id_socio` (`id_socio`),
  KEY `id_acti` (`id_acti`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

CREATE TABLE `socios` (
  `id` int(11) NOT NULL,
  `nombre` varchar(45) NOT NULL,
  PRIMARY KEY (`id`)
  ) ENGINE=InnoDB DEFAULT CHARSET=latin1;



  ADD CONSTRAINT `id_socio` FOREIGN KEY (`id_socio`) REFERENCES `socios` (`id`) ON DELETE
  CASCADE ON UPDATE CASCADE,
  ADD CONSTRAINT `id_acti` FOREIGN KEY (`id_acti`) REFERENCES `actividades` (`id`) ON DELETE
  CASCADE ON UPDATE CASCADE;

А это отношения моих моделей

  **Socios**

   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(
        'actividadesrel' => array(self::HAS_MANY, 'Actividades', 'id_socio'),
    );
    }


    **Activades**

    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(
        'sociosrel' => array(self::HAS_MANY, 'Socios', 'id_socio'),
    );
    }

А это контроллер моего Socio

            public function actionCreate()
        {
    $model=new Socios;

    // Uncomment the following line if AJAX validation is needed
    // $this->performAjaxValidation($model);

    if(isset($_POST['Socios']))
    {
        $model->attributes=$_POST['Socios'];
        if($model->save()) {
        foreach ($_POST['Socios']['actividadesrel'] as $actividadId) {
            $socioActividad = new Axs;
            $socioActividad->socio_id = $model->id;
            $socioActividad->acti_Id = $actividadId;
            if (!$socioActividad->save()) print_r($socioActividad->errors);
            }
            }

    }

    $this->render('create',array(
        'model'=>$model,
    ));
}

И, наконец, в моем социальном виде создать

         <div class="row">
    <?php echo $form->labelEx($model,'Actividades del socio'); ?>
    <?php echo $form->dropDownList($model, 'actividadesrel', CHtml::listData(
    Actividades::model()->findAll(), 'id', 'nombre'), array('multiple'=>'multiple', 
           'size'=>5)
    ); ?>
    <?php echo $form->error($model,'actividadesrel'); ?>
      </div>

Теперь, каждый раз, когда я пытаюсь создать нового партнера (социально), я получаю это сообщение:

  Please fix the following input errors:

ID cannot be blank.

Это сводит меня с ума: P. Я предполагаю, что моя ошибка - очень плохое понимание Yii и ActiveRecord и других дерьмов, связанных с реляционными базами данных.

Вы можете мне помочь?

Спасибо !!!!

1 Ответ

3 голосов
/ 25 марта 2011

Я думаю, что здесь происходит несколько вещей.

1) Эта ошибка (ID cannot be blank.) исходит из вашей модели Socio. Чтобы это исправить, сделайте две вещи:

  1. Убедитесь, что первичный ключ id вашей таблицы Socio установлен на auto_increment, если вы не устанавливаете идентификатор в форме.
  2. Затем проверьте функцию rules () в модели Socio и убедитесь, что ID не требуется. Подробнее о правилах проверки моделей см. В Ultimate Guide .

2) Вы устанавливаете два отношения "HAS_MANY". Вместо этого я бы установил отношение "MANY_MANY", например:

Социальная модель:

public function relations()
{
    return array(
        'actividades'=>array(self::MANY_MANY, 'Actividades',
            'axs(id_socio, id_acti)'),
    );
}

Модель Actividades:

public function relations()
{
    return array(
        'socios'=>array(self::MANY_MANY, 'Socios',
            'axs(id_acti, id_socio)'),
    );
}

Подробнее об отношениях вы можете прочитать в Ultimate Guide .

Надеюсь, это поможет вам встать на правильный путь!

...