registrar valores de varias tablas a través de un único formulario

32 visninger
Gå til det første ulæste opslag

Jose Puertas

ulæst,
31. aug. 2016, 06.12.2931.08.2016
til ZnetDK
Hola Pascal, tengo tres tablas relacionadas entre si, las cuales quiero registrar en un único formulario todos los campos de cada una de ellas, pero la aplicación me da error al no encontrar dónde ubicar algún campo:

En la consulta sql agrego las tres tablas :  select usuarios.*, productos.*,proveedor.* from usuarios,productos,proveedor


en el controlador uso la función $row = $request->getValuesAsMap(' ') donde introduzco todos los campos que hay en el formulario y que el DAO debe registrar incluidos los id's de cada una de las tablas, pero me da error al no encontrar campos para guardar los datos, los nombres están bien escritos tal como lo están en la base de datos, he probado incluso a crear tres DAO consecutivos para que registre los datos de las tablas por separado, pero no hay forma ¿Alguna sugerencia?.

Saludos

Pascal Martinez

ulæst,
4. sep. 2016, 06.06.5204.09.2016
til zne...@googlegroups.com
Hola José,

No puedes grabar los datos de 3 tablas SQL a partir de un único modelo.

Tienes que crear 3 modelos, uno para cada tabla SQL.

Después, tienes que llamar el método store para cada modelo con el parámetro $autocommit a FALSE, en tu código PHP en carga de la grabación,

Un ejemplo abajo con la apertura de una transacción SQL (método beginTransaction) al principio de la grabación de los 3 tablas:

// Storing in the SQL table A ...
$tableADAO
= new \app\model\tableADAO();
// An explicit SQL transaction is started...
$tableADAO
->beginTransaction();
// The autocommit parameter is set to FALSE, so the row data are not committed in database after the call of the store method...
$tableADAO
->store($rowA, FALSE);

// Storing in the SQL table B ...
$tableBDAO
= new \app\model\tableBDAO();
$tableBDAO
->store($rowB, FALSE); // No autocommit...

$tableCDAO
= new \app\model\tableCDAO();
$tableCDAO
->store($rowC, FALSE); // No autocommit...
// The SQL transaction is finally committed to apply the changes in the database.  
$tableCDAO
->commit();

Saludos,

Pascal MARTINEZ

Jose Puertas

ulæst,
4. sep. 2016, 16.38.0604.09.2016
til zne...@googlegroups.com
Hola Pascal, yo intenté haciendo tres modelos e intentando grabarlos de la siguiente forma, lo malo es que al hacer request nunca recoge el id de la tabla anterior:

static protected function action_enregistrer() {
       
/* Lecture des données de la requête HTTP */
        $request
= new \Request();
        $row
= $request->getValuesAsMap('IdEntrenamiento','IdEntrenador', 'Fecha' ,'IdEquipo' );
       
/* Enregistrement des données en Base de données */
        $jugadorDAO
= new tentrenamientoDAO();
       
        $result
= $jugadorDAO->store($row);
       
       
/*lectura de los campos del jugador*/
       
        $requestJ
= new \Request();
   $rowJ
= $requestJ->getValuesAsMap('IdEntrenamientoJugador',IdEntrenamiento,'IdJugador','Idposicion');
       
/* Enregistrement des données en Base de données */
       $jugadorDAOJ
= new \app\model\tnejentrenamientoDAO();
      $resultJ
= $jugadorDAOJ->store($rowJ);
       
       
/*lectura de los campos de la valoracion*/
       
        $requestV
= new \Request();
        $rowV
= $requestV->getValuesAsMap('IdEntrenamientoJugadorValoracion','IdEntrenamientoJugador','IdItems','Valoracion','comentario');
       
/* Enregistrement des données en Base de données */
       $jugadorDAOV
= new \app\model\tnejventrenamientoDAO();
       $resultV
= $jugadorDAOV->store($rowV);
       
/* Réponse retournée au contrôleur principal */
       
        $response
= new \Response();
       
if ($result) {
            $response
->setSuccessMessage('Guardar', 'Entrenamiento guardado correctamente.');
       
} else {
            $response
->setFailedMessage('Guardar', "El Entrenamiento no ha sido guardado.");
       
}
       
return $response;
   
}

Pruebo tu solución que seguro que como siempre es altamente efectiva.
Saludos

Pascal Martinez

ulæst,
7. sep. 2016, 02.05.0907.09.2016
til ZnetDK
Hola José,

Si quieres grabar en una tabla un registro que contiene el identificador del ultimo registro añadido a tu precedente tabla, tienes que recogerlo en una variable cuando llamas el método store y pasarlo en parámetro al llamar del método store siguiente, como mostrado en el ejemplo abajo: 

// Storing in the SQL table A ...
$tableADAO
= new \app\model\tableADAO();
// An explicit SQL transaction is started...
$tableADAO
->beginTransaction();
// The autocommit parameter is set to FALSE, so the row data are not committed in database after the call of the store method...

$rowA
= array('col1'=>'value1','col2'=>'value2','col3'=>'value3');
$tableAId = $tableADAO->store($rowA, FALSE);


// Storing in the SQL table B ...
$tableBDAO
= new \app\model\tableBDAO();

$rowB
= array('col1'=>'value4','col2'=>'value5','col3'=>'value6');
$rowB
['col_id_a'] = $tableAId;
$tableBId = $tableBDAO->store($rowB, FALSE); // No autocommit...



$tableCDAO
= new \app\model\tableCDAO();

$rowC
= array('col1'=>'value7','col2'=>'value8','col3'=>'value9');
$rowC
['col_id_b'] = $tableBId;

$tableCDAO
->store($rowC, FALSE); // No autocommit...
// The SQL transaction is finally committed to apply the changes in the database.  
$tableCDAO
->commit();


Saludos,

Pascal MARTINEZ

Jose Puertas

ulæst,
26. jan. 2017, 17.25.3626.01.2017
til ZnetDK
Solucionado, muchas gracias
Svar alle
Svar til forfatter
Videresend
0 nye opslag