¿Como obtener registro desde postgresql, con campos INT, Character y JSON?
Publicado por John (33 intervenciones) el 18/11/2019 19:49:58
Hola amigos, tengo una tabla en mi BD postgres donde tengo varios tipos de campos, entre ellos, campos JSON, esto será un poco largo, pero es para intentar explicarme lo mejor posible
bien utilizando PDO, nunca he tenido problemas para mostrar los datos empleando AJAX, con algo más o menos así:
Esto me da los resultados que necesito sin ningún tipo de problema.
en la consola el resultado es este:
Ahora mi problema surge cuando intento llamar uno de los campos JSON
obteniedo por consola un objeto dentro de otro objeto como se observa en el indice N° 3:
Entonces finalmente la pregunta es:
¿Es correcto hacer esto así como lo tengo?
¿Como puedo acceder a los valores del indice N°3 ?, si hago algo como esto me da undefined,
imagino que tengo un choque entre lo que es el json_encode() del controlador, porque el campo que estoy llamando ya viene en formato JSON, pero no se como gestionar esta situación, por favor ayudenme
1
2
3
4
5
6
7
8
9
10
CREATE TABLE public.movimientos_trabajador
(
id_movimiento integer NOT NULL DEFAULT nextval('movimientos_trabajador_id_movimiento_seq'::regclass),
old_data json,
new_data json,
id_usuario integer,
fecha date,
id_tipo integer,
CONSTRAINT movimientos_trabajador_pkey PRIMARY KEY (id_movimiento)
);
bien utilizando PDO, nunca he tenido problemas para mostrar los datos empleando AJAX, con algo más o menos así:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
<?php
// Modelo
class ajaxModel extends mainModel{
protected function zoom_move_model($id){
$conexion = parent::conectar();
$sql = "SELECT id_movimiento, nombre, fecha FROM movimientos_trabajador mt
INNER JOIN users u ON (mt.id_usuario = u.id_user)
WHERE id_movimiento = :id";
$result = $conexion->prepare($sql);
$result->bindValue(":id", $id, PDO::PARAM_INT);
$result->execute();
$datos = $result->fetch();
return $datos;
}
}
// Controlador
class ajaxController extends ajaxModel{
// Zoom movimiento
public function zoom_move_controller($id){
$datos = parent::zoom_move_model($id);
return json_encode( $datos );
}
}
// Zoom movimiento
if(isset($_GET['zoom_move'])){
$class = new ajaxController();
$datos = $class->zoom_move_controller($_GET['zoom_move']);
echo $datos;
}
?>
// Javascript
function zoom_mov(id){
$.get("../controllers/ajaxController.php", { zoom_move : id }, function (r){
r = JSON.parse(r);
console.log(r);
document.getElementById("nromove").innerHTML = `N° de movimiento ${r[0]}`;
document.getElementById("m_user").innerHTML = r[1];
document.getElementById("m_date_user_move").innerHTML = r[2];
});
}
Esto me da los resultados que necesito sin ningún tipo de problema.
en la consola el resultado es este:
1
{0: 8, 1: "administrador", 2: "2019-11-15", id_movimiento: 8, nombre: "administrador", fecha: "2019-11-15"}
Ahora mi problema surge cuando intento llamar uno de los campos JSON
1
2
3
$sql = "SELECT id_movimiento, nombre, fecha, old_data FROM movimientos_trabajador mt
INNER JOIN users u ON (mt.id_usuario = u.id_user)
WHERE id_movimiento = :id";
obteniedo por consola un objeto dentro de otro objeto como se observa en el indice N° 3:
1
{0: 8, 1: "administrador", 2: "2019-11-15", 3: "{"id_trabajador":22304,"0":22304,"id_personal":266…nto":null,"9":null,"fecha_egreso":null,"10":null}", id_movimiento: 8, nombre: "administrador", fecha: "2019-11-15", old_data: "{"id_trabajador":22304,"0":22304,"id_personal":266…nto":null,"9":null,"fecha_egreso":null,"10":null}"}
Entonces finalmente la pregunta es:
¿Es correcto hacer esto así como lo tengo?
¿Como puedo acceder a los valores del indice N°3 ?, si hago algo como esto me da undefined,
1
console.log(r[3].id_trabajador); //Undefined
imagino que tengo un choque entre lo que es el json_encode() del controlador, porque el campo que estoy llamando ya viene en formato JSON, pero no se como gestionar esta situación, por favor ayudenme
Valora esta pregunta


0