Guardar Datos Multiples


(The Dive01) #1

bnas todos, tengo el siguiente problema que no he entendido como resolverlo.

tngo en mi accion create un guardado a diferentes modelos.




public function actionCreate()

	{

		

		$model=new Buzon();

		$model2=new Anexo();

		$model3=new Destino();


		$UsuInterno=UsuInterno::model()->findByPk(Yii::app()->user->id);

		$dependencia=$UsuInterno->dependencia;

		

		$User=UsuInterno::model()->findByPk(Yii::app()->user->id);

		$usuinterno=$User->usuint_nombre;

		


		$vid = Yii::app()->db->createCommand('SELECT max(id) FROM buzon')->queryScalar();

		

		// Uncomment the following line if AJAX validation is needed

		// $this->performAjaxValidation($model);

		

		$this->performAjaxValidation(array($model,$model2,$model3));

		if(isset($_POST['Buzon'], $_POST['Anexo'],$_POST['Destino']))

		{

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

			$model2->attributes=$_POST['Anexo'];

			$model3->attributes=$_POST['Destino'];

			

			$model->buz_fechacrea = new CDbExpression('NOW()');

			$model->buz_fechaven = strtotime('today + '. $model->plantilla->plant_diasmax . ' days');

		

			$model2->ane_rutaarchivo=CUploadedFile::getInstance($model2,'ane_rutaarchivo');

			$model2->buzon_id=$vid+1;


                        $model3->usuario_interno_id="usuario_interno_id";

			

			$model->usuinterno_id=Yii::app()->user->id;

			

			if($model2->save() && $model->save()){

				

				$model2->ane_rutaarchivo->saveAs(Yii::getPathOfAlias('webroot').'/protected/images/'.$model2->ane_rutaarchivo);

				

				$this->redirect(array('view','id'=>$model->id));

		

			}

		}

		$this->render('create',array(

			'model'=>$model,

			'model2'=>$model2,

			'model3'=>$model3,

			'dependencia'=>$dependencia,

			'usuinterno'=>$usuinterno,

		));

	}



esta es la relacion.


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(


		'anexos'=>array(self::HAS_MANY,'Anexo','buzon_id'),

		'destinos'=>array(self::MANY_MANY,'Destino','destino(buzon_id, usuario_interno_id)','together'=>true),


		);

	}

la primera relacion me funciona muy bn!! la de model2 pero a la hora de hacer lo mismo con otra relacion model3, de MANY_MANY, donde es la tabla buzon, una nueva tabla destino y una usuario_interno donde la tabla destino es el resultado de la relacion entre buzon y usuario_interno.

buzon: id, buz_tipo, etc

destino: buzon_id, usuario_interno_id.

usuario_interno: id, nombre, etc

en el form tengo lo siguiente:





<div class="form">

<p  align="center" ><?php echo CHtml::image(Yii::app()->theme->baseUrl."/images/footer.png");

?><br><?php 

echo date("d-m-Y");

?><br><?php  

echo CHtml::encode($dependencia->dep_nombre) ;


?></center></p>


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

	'id'=>'buzon-form',

	'enableAjaxValidation'=>false,

	'htmlOptions' => array('enctype'=>'multipart/form-data'),

)); ?>


<p class="note">Columnas con <span class="required">*</span> son requeridas.</p>


<?php echo $form->errorSummary(array($model,$model2,$model3)); ?>


/.../


<div class="row">

		<?php echo $form->labelEx($model3,'usuario_interno_id'); ?>

		<?php echo $form->checkBoxList($model3,'usuario_interno_id',CHtml::listData(UsuInterno::model()->findAll(),'id','usuint_nombre'),array('empty'=>'Seleccione un nombre')); ?>

		<?php echo $form->error($model3,'usuario_interno_id'); ?>

	</div>


	<div class="row">

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

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

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

	</div>

	

	<div class="row">

		<?php echo $form->labelEx($model2,'Anexo'); ?>

		<?php echo $form->fileField($model2,'ane_rutaarchivo'); ?>

		<?php echo $form->error($model2,'ane_rutaarchivo'); ?>

	</div>


	<div class="row buttons">

		<?php echo CHtml::submitButton($model->isNewRecord ? 'Crear' : 'Guardar'); ?>

	</div>


<?php $this->endWidget(); ?>

<p  align="center" ><?php echo CHtml::image(Yii::app()->theme->baseUrl."/images/header.png");?></center></p>

</div>



mi pregunta es como hago para guardar el $model3, sabiendo que tiene multiples registros. Estuve buscando pero la vdd nunca explican muy bn como hacerlo que con un while o un for pero no se como hacerlo en el controller, no entiendo.

y en el save se haria igual? siemplemente poner: if($model3->save() && $model2->save() && $model->save()){

lo intente implementando esto pero no me da.

$model3->usuario_interno_id=implode(’,’,$model3->usuario_interno_id);

la idea es que en la tabla destino queden guardados los usuarios a los q se envia el buzon por ejemplo a los usuarios con id 1,2,3 les pertenece el buzon 1

destino

buzon_id usuario_interno_id

 1------------&#62;1


 1------------&#62;2


 1------------&#62;3

se supone que debe quedar guardado asi!

Agradecería mucho la ayuda :D

modelo E/R:

[/php]


(Ricobregon) #2

Hola dreslop,

Está a medio paso de hacerlo :)

Un par de extensiones que facilitan este trabajo son:

Mi favorito es el segundo (me permite más control), pero creo que para su caso podría adaptarse un poco más el primero (porque requiere solo un comando save()).

Saludos.


(The Dive01) #3

gracias robregonm por tu ayuda me has sacado de unas grandes :D, estoy usando la primera como me lo recomendaste pero me surge una pregunta esta seccion de codigo va en el modelo o en el controller?




<?php

$post=new Post;

$post->title='Relational saving is not a dream anymore.';

$post->content='Since WithRelatedBehavior released...';


$tag1=new Tag;

$tag1->name='relation';

$tag2=new Tag;

$tag2->name='save';


$post->tags=array($tag1,$tag2);


$post->withRelated->save(true,array('tags'));



es que no entiendo muy bn si me toca modificar todo el create del controller o q!?


(Ricobregon) #4

Eso depende de lo rígido que sea a la hora de implementar los estándares de desarrollo :)

Respuesta corta: Debería ir en el controller.

Respuesta corta de la respuesta larga: En ambos XD