Multi cadastro

Senhores

eu tenho 3 tabelas para fazer um cadastro

[b]tebela_1

tebela_2

tebela_3[/b]

[b]id_tb_1

id_tb_2

id_tb_3[/b]

O id_tb_1 será incerida na tabela_2

E o id_tb_2 será incerido na tabela_3 varias vezes

quando eu cadastro ele me gera isso …




Array

(

    [tebela_1] => Array

        (

            [id] => 233

            [ativo] => S

            [texto] => cadastro teste 01

            [revisao] => 1

        )


    [tebela_2] => Array

        (

            [id_tb_1] => Array

                (

                    [0] => Controle 1

                    [1] => Controle 2

                    [2] => Controle 3

                )


        )


    [tebela_3] => Array

        (

            [id_tb_2] => Array

                (

                    [0] => Verificação 1.1

                    [1] => Verificação 1.2

                    [2] => Verificação 1.3

                    [3] => Verificação 2.1

                    [4] => Verificação 2.2

                    [5] => Verificação 2.3

                    [6] => Verificação 3.1

                    [7] => Verificação 3.2

                    [8] => Verificação 3.3

                )


        )


    [yt6] => Cadastrar

)



como eu associo isso ???




[tebela_2] => Array

        (

            [id_tb_1] => Array

                (

                    [0] => Verificação 1

                )


        )


[tebela_3] => Array

        (

            [id_tb_2] => Array

                (

                    [ID] => Verificação 1.1

                    [ID] => Verificação 1.2

                    [ID] => Verificação 1.3

                )


        )




via $_POST ??

eu uso javascript para multiplicar os campos de preenchimento do formulário …

Radames,

Qual seria a ordem da inserção!

Inserir todas de uma só vez, ou usar a primary key da Tabela 1, na Tabela 2, a primary key da Tabela 2 na Tabela 3?

Você pode fazer assim resumidamente:


$model1 = new Tabela1;

$model2 = new Tabela2;

$model3 = new Tabela3;


if(isset($_POST['tabela_1'])){


	$model1->attributes = $_POST['tabela_1'];

	

	if($model1->save()){

	

		if(isset($_POST['tabela_2'])){


			$model2->primaryKey = $model1->primaryKey;

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

			

			if($model2->save()){


				if(isset($_POST['tabela_3'])){

					

					$model3->primaryKey = $model2->primaryKey;

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

					

					$model3->save();

				}			

			}

		}

	}

}

Você pode fazer isso utilizando o método transaction também.

No caso, você primeiro cria uma função no controller responsavel por efetuar o

processamento dos dados referentes a cada model.


	 protected function transactionDados($model, $postvars) {

		// Cria as relações de dados

		$transaction = $model->dbConnection->beginTransaction();

		try

		{

			if($postvars) {

				$model->attributes = $postvars;

				$model->save();

				$transaction->commit();

			}

		}

		catch(Exception $e) // Exception que cancela a alteração em caso de erro

		{

			$transaction->rollBack();

		}	 

	 }

E depois no action de sua necessidade, transforma os Models e Postvars em array e chama a função responsavel pelo processamento dos dados.


	 ...

	 {

	 

		$models = array(array($model1, $_POST['Model1']), array($model1, $_POST['Model2']), array($model1, $_POST['Model3']));

		foreach ($models as $model) {

			$this->transactionDados($model[0], $model[1]));

		}	 

	 }

Acredito que desta forma fica bem mais dinâmico e prático inserir dados no banco de dados.

Será mais ou menos dessa forma representada no desenho …

2662

registrotabela.jpg

att,

acho que essa imagem fica melhor ainda …

2663

registrotabela(1).jpg

att,

Segue o código exemplo … de como eu fiz mas não deu certo devido ao array mais o for




public function actionCreate()

{

	$model1	= new tabela1;

	$model2	= new tabela2;

	$model3	= new tabela3;

	

	if ( isset($_POST['tabela1']) )

	{	

		$model1->attributes = $_POST['tabela1'];

		

		if ( $model1->validate() ) {

			$model1->save();

		}

		

		if ( $model1->id1 )

		{

			if ( isset($_POST['tabela2']) )

			{

				$id2 = $_POST['tabela2']['id2'];


				for ($j = 0 ; $j <= count($id2) ; $j++)

				{

					$model2 = new tabela2;


					$model2->id1 = (int)$model1->id1;

					$model2->nome = $nome[$j];

					

					if ( $model2->validate() )

					{

						$model2->save();

						if ( $model2->id2 )

						{

							if ( isset($_POST['tabela3']) )

							{

								$id3 = $_POST['tabela3']['id3'];


								for ($i = 0 ; $i <= count($id3) ; $i++)

								{

									$model3 = new tabela3;

									

									$model3->id2  = (int)$model2->id2;

									$model3->nome = $nome[$i];

									

									if ( $model3->validate() )

									{

										$model3->save();

										echo $model3->id3;

									}


								} // Segundo for.

							} // if do tabela3.

						}

					}

				} // Primeiro for.

			} // fim do if tabela2 and tabela3 ...

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

		} // fim do id1.


	} // fim do isset tabela1.


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

		'model1'	=> $model1,

		'model2'	=> $model2,

		'model3'	=> $model3,

	));

}



Nesse caso, quando a chave primária do $model1 é passada para os models seguintes?

Quando o $model3 retornar uma exception, por exemplo, o módulos anteriores que sensibilizaram o banco não serão afetados pelo rollback do $model3, não é?!

É má interpretação do código de minha parte, ou o algoritmo está incompleto?

Estou tentando aplicar a lógica citada, mas ainda sem muito sucessos.

some help?

Então @Tirus

Eu tenho que criar uma Ficha, essa ficha tem Vários Itens de Controle e para cadas Itens de Controle tem vários Itens de Verificação.

primeiro eu salvo no Banco a Ficha, e depois atribua para cada Itens de Controle e salvo no banco …

E depois eu não consigo salvar para cada Itens de Controle os Itens de Verificação

eu criei um formulário que tem um botão que adiciona a quantidade que eu quero de Itens de Controle e adiciona para cada Itens de Controle a quantidade que eu quero para cada Itens de Verificação.

Lembrando que isso gerará uma Ficha.

é interessante isso …

Eu estou pensado em trazer via form

assim,




$id3 = $_POST['tabela3']['id2']['id3'];