Одна Модель Для Нескольких Таблиц

Здравствуйте!

Подскажите пожалуйста имеется ли возможность в Yii создать одну модель для нескольких таблиц? Если такая возможность имеется, то хотелось бы узнать как.

Подобная потребность возникает в случае, когда имеется две основные таблицы и 5-7 справочников.

Например: Имеется база компов, состоящая из пары основных таблиц и нескольких справочников. Имеется форма внесения нового компа в базу. В этой форме есть несколько DropList-ов, которые заполняются из справочников (DropList с типами процессоров из справочника процессоров, DropList типов операвивки из справочника оперативки и тд).

А при нажатии "Сохранить" надо сохранять данные в одну из основных таблиц.

Сейчас делаю всё это исходя из стандартного дзена Yii - "одна таблица - одна модель". Но при таком раскладе мне в одном экшене контроллера страницы добавления компа приходится создавать кучу объектов моделей, передавать кучу переменных только для заполнения DropList-ов из справочников, и это я ещё не добрался до написания процедуры сохранения.

HTML-элементы формы я генерирую просто через CHtml. Понимаю, что это топорно в случае если форма большая (у меня она не маленькая). Как это всё реализовать при помощи виджета я пока не понимаю.

Заранее благодарю!

Прошу прощения за длинный рассказ, но хотелось описать ситуацию как можно подробнее.

Почитайте про связные таблицы в Yii и про сохранение связных данных.

Я заполнял дробпоксы значениями из статических методов в моделях справочниках, которые сам делал.

Например "квест" привязан к какой-то локации (place), Place - в данном случае это справочник, в нем делаю статический метод возвращающий все локации в виде массива id->name




  static public function getList(){

      $arr=self::model()->findAll();

      return CHtml::listData($arr, 'id', 'name' );

  }



в вьюхе просто использую: …=>Place::getList()

Таким образом и в контроллере ничего создавать не надо, и в представлении прямого доступа к базе нет.

А еще замечательная вещь CActiveForm позволяет связать эти все дроп-листы и поля ввода для того чтобы со спокойной душей сохранить это все.

Вот как предлагает нам это сделать CRUD:


<?php $form=$this->beginWidget('CActiveForm', array(

	'id'=>'lists-form',

	'enableAjaxValidation'=>false,

)); ?>

	<p class="note">Fields with <span class="required">*</span> are required.</p>

	<?php echo $form->errorSummary($model); ?>

	<div class="row">

		<?php echo $form->labelEx($model,'list_id'); ?>

		<?php echo $form->textField($model,'list_id'); ?>

		<?php echo $form->error($model,'list_id'); ?>

	</div>

Значения для дроп-листов подтягивайте из геттеров в моделях. Если вы вылазите за пределы этих возможностей - делайте с CHtml но учитывайте это при сохранении.

Собственно сохранение для стандартной формы:


$model->attributes=$_POST['ContactForm'];

      $model->save();



Если вылезли за рамки стандартной формы (что бывает например при использовании мультиселектов, чекбоксов и прочего) - потрудитесь заполнить аттрибуты самостоятельно. Сформируйте массив и сделайте масс асигн или же по старинке руками.

Если я правильно понимаю методику работы с CHtml, то значения из полей, сгенерированных при помощи CHtml, нужно принимать вручную.

Т.е. например:




$proctype = $_POST['proctype'];

$ramtype = $_POST['ramtype'];

...и тд



да. но я уже потерял суть обсуждения. proctype и ramtype это модели? В чем именно у вас возникают сложности?

2 ineersa: CActiveForm действительно хорош, для выпадающих списков я его тоже использую, например если бы в моделе Comp было бы поле "cpu_id" которое бы указывало на справочник Cpu то я бы написал




        <div class="row">

                <?php echo $form->labelEx($model,'cpu_id'); ?>

                <?php echo $form->dropDownList($model,'cpu_id', Cpu::getList()); ?>

                <?php echo $form->error($model,'cpu_id'); ?>

        </div>



только вот не пойму об этом ли идет речь в топике.

Реквестирую больше кода на pastebin или https://gist.github.com/ :)

Вот собственно пример моей формы:

https://gist.github.com/ineersa/5917325

И контроллера https://gist.github.com/ineersa/5917363

Возможно вам поможет это немного.

А почему не написать




$model->attributes = $_POST['Feeds'];

$model->setAttributes($_POST['Feeds']);//если не путаю тут еще можно указать делать ли валидацию 2 параметром



Но понять зачем к 2 таблицам одна модель так и не удалось, у вас одинаковые данные хранятся в разных таблицах ?

Это насколько я понимаю адресовано мне. Так нельзя сделать так как в этой форме 2 checkboxlist. Можно записать $_POST в массив, потом убрать из этого массива ненужное и заменить на нужное и сделать

$model->attributes=$attributes. Я собственно так и делаю на больших формах, просто в этой быстрее было раскидать атрибуты руками.

Код выложен для примера топик стартеру. Мне не нужно 1 модель к двум таблицам :D