radames
(Radameh)
March 7, 2012, 2:49pm
1
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 …
Newerton
(Newerton Araujo)
March 9, 2012, 12:27am
2
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.
radames
(Radameh)
March 13, 2012, 8:28pm
4
Será mais ou menos dessa forma representada no desenho …
2662
att,
radames
(Radameh)
March 13, 2012, 8:41pm
5
acho que essa imagem fica melhor ainda …
2663
att,
radames
(Radameh)
March 13, 2012, 8:54pm
6
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,
));
}
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.
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?
radames
(Radameh)
May 17, 2012, 7:12pm
8
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 …
radames
(Radameh)
May 17, 2012, 7:15pm
9
Eu estou pensado em trazer via form
assim,
$id3 = $_POST['tabela3']['id2']['id3'];