PHPackages                             osvaldogdelrio/pdo-database - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Database &amp; ORM](/categories/database)
4. /
5. osvaldogdelrio/pdo-database

ActiveLibrary[Database &amp; ORM](/categories/database)

osvaldogdelrio/pdo-database
===========================

Clase en PHP para trabajar con PDO

v1.0(4y ago)17[1 PRs](https://github.com/OsvaldoGDelRio/pdo-database/pulls)MITPHPCI failing

Since Sep 12Pushed 3mo ago1 watchersCompare

[ Source](https://github.com/OsvaldoGDelRio/pdo-database)[ Packagist](https://packagist.org/packages/osvaldogdelrio/pdo-database)[ RSS](/packages/osvaldogdelrio-pdo-database/feed)WikiDiscussions main Synced today

READMEChangelog (1)Dependencies (3)Versions (4)Used By (0)

[![Scrutinizer Code Quality](https://camo.githubusercontent.com/488e5948b3090f5882a0dfb82d71637b7e0e1fd5c61cf107c25bde178fce862c/68747470733a2f2f7363727574696e697a65722d63692e636f6d2f672f4f7376616c646f4744656c52696f2f70646f2d64617461626173652f6261646765732f7175616c6974792d73636f72652e706e673f623d6d61696e)](https://scrutinizer-ci.com/g/OsvaldoGDelRio/pdo-database/?branch=main)[![Build Status](https://camo.githubusercontent.com/d6ab99e26b3cdea2a2ab512ca7cebf2dea6e30f7720546cb6aa69783d21d17ba/68747470733a2f2f7363727574696e697a65722d63692e636f6d2f672f4f7376616c646f4744656c52696f2f70646f2d64617461626173652f6261646765732f6275696c642e706e673f623d6d61696e)](https://scrutinizer-ci.com/g/OsvaldoGDelRio/pdo-database/build-status/main)[![Code Intelligence Status](https://camo.githubusercontent.com/a39275cdad401081fd42cef9a92e9e74eb9ed9fb11d35ceb3687c08b80b41438/68747470733a2f2f7363727574696e697a65722d63692e636f6d2f672f4f7376616c646f4744656c52696f2f70646f2d64617461626173652f6261646765732f636f64652d696e74656c6c6967656e63652e7376673f623d6d61696e)](https://scrutinizer-ci.com/code-intelligence)[![Code Coverage](https://camo.githubusercontent.com/d7d661c7c141b7b08ad07d762adfa63ee48ae641a82f16981c32d8bd3db617a6/68747470733a2f2f7363727574696e697a65722d63692e636f6d2f672f4f7376616c646f4744656c52696f2f70646f2d64617461626173652f6261646765732f636f7665726167652e706e673f623d6d61696e)](https://scrutinizer-ci.com/g/OsvaldoGDelRio/pdo-database/?branch=main)[![Travis Build Status](https://camo.githubusercontent.com/70a61da39441f8125f73cf770650b1371decd7a75b0b0708c68288a66a7498ee/68747470733a2f2f6170702e7472617669732d63692e636f6d2f4f7376616c646f4744656c52696f2f70646f2d64617461626173652e7376673f6272616e63683d6d61696e)](https://app.travis-ci.com/OsvaldoGDelRio/pdo-database)

pdo-database
------------

[](#pdo-database)

Librería en PHP para trabajar con PDO y bases de datos SQL escrita en español.

Hasta el momento contiene funcionalidad básica:

[SELECT](https://github.com/OsvaldoGDelRio/pdo-database#select)[JOIN](https://github.com/OsvaldoGDelRio/pdo-database#join)[ORDER](https://github.com/OsvaldoGDelRio/pdo-database#order)[LIMIT](https://github.com/OsvaldoGDelRio/pdo-database#limit)[ORDER-LIMIT](https://github.com/OsvaldoGDelRio/pdo-database#order-limit)[INSERT](https://github.com/OsvaldoGDelRio/pdo-database#insert)[UPDATE](https://github.com/OsvaldoGDelRio/pdo-database#update)[DELETE](https://github.com/OsvaldoGDelRio/pdo-database#delete)[TRUNCATE](https://github.com/OsvaldoGDelRio/pdo-database#truncate)

Instalación
-----------

[](#instalación)

Escrita en PHP 8.0

Requiere: PSR-4: Autoloader para un mejor funcionamiento sin tener que reescribir los namespace

### Vía composer

[](#vía-composer)

```
composer require osvaldogdelrio/pdo-database
```

### Requiere de Factory para un mejor uso aunque puede utilizarse sin este método

[](#requiere-de-factory-para-un-mejor-uso-aunque-puede-utilizarse-sin-este-método)

```
composer require osvaldogdelrio/factory
```

Usarla sin Factory requiere de mucho código que puede llegar a ser abrumador en proyectos que implementan Modelos, Controladores y Vistas, para realizar una conexión de forma tradicional hay que hacer:

```
$conexion = new ConexionBaseDeDatos(
            new HostBaseDeDatos('127.0.0.1'),
            new BaseDeDatos('test'),
            new UsuarioBaseDeDatos('root'),
            new ContrasenaBaseDeDatos('')
        );
$conexion = $conexion->conectar();

/*
    $conexion Es el objeto PDO con el que interactuará el resto de la librería
*/
```

Para realizarla con Factory y la clase CrearConexionBaseDeDatos

```
/*
    La clase src/pdodatabase/conexion/CrearConexionBaseDeDatos.php
    contiene los datos de conexión o se pueden implementar con un require_once
    o pasarlos por medio del array
*/
$conexion = $factory->crear('CrearConexionBaseDeDatos',[]);

$conexion = $conexion->conectar();
/*
    $conexion Es el objeto PDO con el que interactuará el resto de la librería
*/
```

Para ejecutar un sentencia "SELECT \* FROM id WHERE Idusuario = 1" y mostrar los resultados en arrays sin Factory se requiere

```
$conexion = new ConexionBaseDeDatos(
                new HostBaseDeDatos('127.0.0.1'),
                new BaseDeDatos('test'),
                new UsuarioBaseDeDatos('root'),
                new ContrasenaBaseDeDatos('')
        );

$conexion = $conexion->conectar();

$consulta = new ConsultaSelectWhere(
    new EjecutarConsultaConDatos(
        $conexion
    ),
    new SentenciaSelectWhere(
        new CamposYTabla(
            new Campos(['*']),
            new Tabla('id')
        ),
        new Como(
            new Where(
                new ValidadorDeParametrosWhere(
                    ['idusuario','=',1]
                )
            )
        )
    )
);

$resultados = new ResultadoEnArrays;

$resultados = $resultados->resultado($consulta->obtener());

print_r($resultado);

/*
array
*/
```

Las tablas necesarias para las pruebas de la librería están disponibles en test.sql usando:

- base de datos: test
- usuario: root
- password:
- host: 127.0.0.1

Listado de sentencias con código usando Factory
-----------------------------------------------

[](#listado-de-sentencias-con-código-usando-factory)

### SELECT

[](#select)

SELECT \* FROM prueba

```
$select = $factory->crear('src\factory\Select',[
    'tabla' => 'prueba',
    'campos' => ['*']
]);
```

SELECT id,uno,dos FROM prueba

```
$select = $factory->crear('src\factory\Select',[
    'tabla' => 'prueba',
    'campos' => ['id','uno','dos']
]);
```

### Operadores lógicos aceptados en la sentencia WHERE, AND y OR

[](#operadores-lógicos-aceptados-en-la-sentencia-where-and-y-or)

Cuando la sentencia se construye se valida que el operador lógico unicamente sea cualquiera de estos:

```
=
>
<
>=

LIKE
IN

```

### Reglas de validación para la construcción de sentencias WHERE

[](#reglas-de-validación-para-la-construcción-de-sentencias-where)

- El nombre de columna solo puede ser string
- Tiene que ser un operador lógico valido
- Ningun valor puede estar vacío

### Reglas de validación para la construcción de sentencias WHERE AND, WHERE OR

[](#reglas-de-validación-para-la-construcción-de-sentencias-where-and-where-or)

- Tiene que ser un operador lógico valido
- Ningun valor puede estar vacíos
- Los campos solo pueden ser string

### Reglas de validación para la construcción de sentencias BETWEEN, NOT BETWEEN

[](#reglas-de-validación-para-la-construcción-de-sentencias-between-not-between)

- Los valores no pueden estar vacios
- Los valores no pueden ser iguales, ejemplo (WHERE id BETWEEN 1 AND 1)

SELECT \* FROM prueba WHERE id = ?

```
$select = $factory->crear('src\factory\SelectWhere',[
    'tabla' => 'prueba',
    'campos' => ['*'],
    'where' => ['id','=','1']
]);
```

SELECT \* FROM prueba WHERE id = ? AND uno != ?

```
$select = $factory->crear('src\factory\SelectWhereAnd',[
    'tabla' => 'prueba',
    'campos' => ['*'],
    'where' => ['id','=','1','uno','!=','1']
]);
```

SELECT \* FROM prueba WHERE id = ? OR uno != ?

```
$select = $factory->crear('src\factory\SelectWhereOr',[
    'tabla' => 'prueba',
    'campos' => ['*'],
    'where' => ['id','=','1','uno','!=','1']
]);
```

SELECT \* FROM prueba WHERE id BETWEEN ? AND ?

```
$select = $factory->crear('src\factory\SelectWhereBetween',[
    'tabla' => 'prueba',
    'campos' => ['*'],
    'where' => ['id','1','10']
]);
```

SELECT \* FROM prueba WHERE id NOT BETWEEN ? AND ?

```
$select = $factory->crear('src\factory\SelectWhereNotBetween',[
    'tabla' => 'prueba',
    'campos' => ['*'],
    'where' => ['id','1','10']
]);
```

### INSERT

[](#insert)

INSERT INTO prueba (uno,dos,tres) VALUES (?,?,?)

```
$select = $factory->crear('src\factory\Insert',[
    'tabla' => 'prueba',
    'valores' => ['uno' => 123, 'dos' => 1234, 'tres' => 12345]
]);
```

### UPDATE

[](#update)

UPDATE prueba SET uno = ?,dos = ? WHERE id = ?

```
$select = $factory->crear('src\factory\Update',[
    'tabla' => 'prueba',
    'valores' => ['uno' => 1, 'dos' => 2],
    'where' => ['id','=',1]
]);
```

UPDATE prueba SET uno = ? WHERE id = ? AND id = ?

```
$select = $factory->crear('src\factory\UpdateWhereAnd',[
    'tabla' => 'prueba',
    'valores' => ['uno' => 1],
    'where' => ['id','=',1,'id','=',6]
]);
```

UPDATE prueba SET uno = ? WHERE id = ? OR id = ?

```
$select = $factory->crear('src\factory\UpdateWhereOr',[
    'tabla' => 'prueba',
    'valores' => ['uno' => 1],
    'where' => ['id','=',1,'id','=',6]
]);
```

UPDATE prueba SET uno = ? WHERE BETWEEN id ? AND ?

```
$select = $factory->crear('src\factory\UpdateWhereBetween',[
    'tabla' => 'prueba',
    'valores' => ['uno' => 1],
    'where' => ['id',1,5]
]);
```

UPDATE prueba SET uno = ? WHERE NOT BETWEEN id ? AND ?

```
$select = $factory->crear('src\factory\UpdateWhereNotBetween',[
    'tabla' => 'prueba',
    'valores' => ['uno' => 1],
    'where' => ['id',1,5]
]);
```

### DELETE

[](#delete)

No acepta la sentencia sin el valor WHERE, WHERE AND, WHERE OR, WHERE BETWEEN o WHERE NOT BETWEEN, para borrar todo el contenido de una tabla usar TRUNCATE

DELETE FROM prueba WHERE id = ?

```
$select = $factory->crear('src\factory\Delete',[
    'tabla' => 'prueba',
    'where' => ['id','=',1]
]);
```

DELETE FROM prueba WHERE id = ? AND id = ?

```
$select = $factory->crear('src\factory\DeleteWhereAnd',[
    'tabla' => 'prueba',
    'where' => ['id','=',1,'id','=',3]
]);
```

DELETE FROM prueba WHERE BETWEEN id ? AND ?

```
$select = $factory->crear('src\factory\DeleteWhereBetween',[
    'tabla' => 'prueba',
    'where' => ['id',1,3]
]);
```

DELETE FROM prueba WHERE NOT BETWEEN id ? AND ?

```
$select = $factory->crear('src\factory\DeleteWhereNotBetween',[
    'tabla' => 'prueba',
    'where' => ['id',1,100]
]);
```

### JOIN

[](#join)

Acepta INNER, RIGHT, LEFT, FULL

```
SELECT prueba.*,prueba2.uno AS columnauno
FROM prueba
INNER JOIN prueba2 ON prueba.uno = prueba2.uno
```

```
$join = $factory->crear('src\factory\Join', [
    'tabla' => 'prueba', //La tabla principal
    'campos' => ['*'], // Los campos de la tabla principal
    'join' =>
    [
        [
            'tipo' => 'inner', //Tipo de Join: inner, left, right, full
            'tabla' => 'prueba2', // Tabla que se va a unir
            'campos' => ['uno AS columnauno'], //Los campos de la tabla que se va a unir
            'key' => ['uno'] // El nombre de columna con el cual se va a enlazar
        ]
    ]
])
```

Las consultas con JOIN pueden llegara ser bastante complejas, esta librería puede armar una enorme cantidad de JOINs de forma relativamente sencilla, el esquema es simple, los elementos básicos del JOIN se colocan en un array, y este puede tener multiples JOIN a tablas internas, por ejemplo, en el siguiente ARRAY se arma una consulta que dice:

```
SELECT prueba.*,prueba5.cinco AS columnacinco,prueba4.cuatro AS columnacuatro,prueba3.dos AS columnados,prueba2.uno AS columnauno
FROM prueba
INNER JOIN prueba2 ON prueba.uno = prueba2.uno
INNER JOIN prueba3 ON prueba.dos = prueba3.dos
INNER JOIN prueba4 ON prueba3.cuatro = prueba4.cuatro
INNER JOIN prueba5 ON prueba4.cinco = prueba5.cinco
```

En definitiva no hay forma "sencilla" de armar una sentencia tan larga como puede ser un JOIN y que no confunda un poco, sin embargo, es muy útil poderlos hacer con arrays de forma practicamente ilimitada.

```
$datos = [
    'tabla' => 'prueba',
    'campos' => ['*'],
    'join' =>
    [
        [
            'tipo' => 'inner',
            'tabla' => 'prueba2',
            'campos' => ['uno AS columnauno'],
            'key' => ['uno']
        ],
        [
            'tipo' => 'inner',
            'tabla' => 'prueba3',
            'campos' => ['dos AS columnados'],
            'key' => ['dos'],
            'join' =>
            [
                [
                    'tipo' => 'inner',
                    'tabla' => 'prueba4',
                    'campos' => ['cuatro AS columnacuatro'],
                    'key' => ['cuatro'],
                    'join' =>
                    [
                        [
                            'tipo' => 'inner',
                            'tabla' => 'prueba5',
                            'campos' => ['cinco AS columnacinco'],
                            'key' => ['cinco']
                        ]
                    ]
                ]
            ]
        ]
    ]
];

$select = $factory->crear('src\factory\Join', $datos);
```

Esta consulta la podemos dividir en distintos arrays:

```
$tabla5 =
    [
        'tipo' => 'inner',
        'tabla' => 'prueba5',
        'campos' => ['cinco AS columnacinco'],
        'key' => ['cinco']
    ];

$tabla4 =
    [
        'tipo' => 'inner',
        'tabla' => 'prueba4',
        'campos' => ['cuatro AS columnacuatro'],
        'key' => ['cuatro'],
        'join' => $tabla5
    ];

$tabla3 =
    [
        'tipo' => 'inner',
        'tabla' => 'prueba3',
        'campos' => ['dos AS columnados'],
        'key' => ['dos'],
        'join' => $tabla4
    ];

$tabla2 =
    [
        'tipo' => 'inner',
        'tabla' => 'prueba2',
        'campos' => ['uno AS columnauno'],
        'key' => ['uno']
    ];

$datos =
    [
        'tabla' => 'prueba',
        'campos' => ['*'],
        'join' => $tabla2, $tabla3
    ];

/*El campo que le indica a la clase que debe de crear otro JOIN que tiene como tabla una diferente a la principal es:

'join' => [
    // lo que esté dentro de este array se considera un JOIN a la tabla indicada en el mismo array del que sale.
    [
        'tipo' => '' tipo del join a ejecutar
        'tabla'=> '', Nombre d ela tabla
        'campos' => [], Valores ilimitados separados por comas (,) o un simple '*' para seleccionar todo
        'key' => [] Máximo 2 valores permitidos
    ],
    [
        Más datos indicando otro JOIN
    ]
];

Si los nombres de columna en donde se realiza el enlace de las dos tablas no son iguales, el valor a escribir en el array es:

['nombre_de_columna_tabla_padre','nombre_de_columna_tabla_hijo']

Si son iguales en ambas tablas solo un valor:

['nombre de columna']
*/
```

JOIN WHERE

```
SELECT prueba.*,prueba5.cinco AS columnacinco,prueba4.cuatro AS columnacuatro,prueba3.dos AS columnados,prueba2.uno AS columnauno
FROM prueba
INNER JOIN prueba2 ON prueba.uno = prueba2.uno
INNER JOIN prueba3 ON prueba.dos = prueba3.dos
INNER JOIN prueba4 ON prueba3.cuatro = prueba4.cuatro
INNER JOIN prueba5 ON prueba4.cinco = prueba5.cinco
WHERE prueba.id = ?
```

```
$datos = [
    'tabla' => 'prueba',
    'campos' => ['*'],
    'where' => ['prueba.id','=',1],
    'join' =>
    [
        [
            'tipo' => 'inner',
            'tabla' => 'prueba2',
            'campos' => ['uno AS columnauno'],
            'key' => ['uno']
        ],
        [
            'tipo' => 'inner',
            'tabla' => 'prueba3',
            'campos' => ['dos AS columnados'],
            'key' => ['dos'],
            'join' =>
            [
                [
                    'tipo' => 'inner',
                    'tabla' => 'prueba4',
                    'campos' => ['cuatro AS columnacuatro'],
                    'key' => ['cuatro'],
                    'join' =>
                    [
                        [
                            'tipo' => 'inner',
                            'tabla' => 'prueba5',
                            'campos' => ['cinco AS columnacinco'],
                            'key' => ['cinco']
                        ]
                    ]
                ]
            ]
        ]
    ]
];

$select = $factory->crear('src\factory\JoinWhere', $datos);
```

De la misma forma podemos agregar al JOIN la sentencia WHERE AND, WHERE OR, WHERE BETWEEN y WHERE NOT BETWEEN, solo modificando en contenido del array en la llave 'where' =&gt;

```
// Se agrega al array en el espacio where 6 datos 'nombre_de_columna','operador_lógico','valor','nombre_de_columna','operador_lógico','valor'
$select = $factory->crear('src\factory\JoinWhereAnd', $datos);
$select = $factory->crear('src\factory\JoinWhereOr', $datos);

// Se colocan los 3 datos 'nombre_de_columna','valor1','valor2'
$select = $factory->crear('src\factory\JoinWhereBetween', $datos);
$select = $factory->crear('src\factory\JoinWhereNotBetween', $datos);
```

### ORDER

[](#order)

Para agregar la sentencia ORDER BY en sentencias tipo SELECT ya sea con cualquier combinación de WHERE o JOIN solo hay que llamar la clase Factory terminando con OrderBy:

SELECT \* FROM prueba ORDER BY id ASC

```
$datos = [
    'tabla' => 'prueba',
    'campos' => ['*'],
    'order' => 'id ASC'
];
$select = $factory->crear('src\factory\SelectOrderBy', $datos);
```

Para realizar una consulta SELECT WHERE ORDER BY la clase esta esta: SelectWhereOrderBy, todas clases que terminen en OrderBy aceptarán el parametro 'order' en el array

### LIMIT

[](#limit)

Para agregar la sentencia LIMIT en sentencias tipo SELECT ya sea con cualquier combinación de WHERE o JOIN solo hay que llamar la clase Factory terminando con Limit:

SELECT \* FROM prueba LIMIT 1

```
$datos = [
    'tabla' => 'prueba',
    'campos' => ['*'],
    'limit' => '1' // Limit tiene que ser numérico pero String
];
$select = $factory->crear('src\factory\SelectLimit', $datos);
```

Para realizar una consulta SELECT WHERE LIMIT la clase esta esta: SelectWhereLimit, todas clases que terminen en Limit aceptarán el parametro 'limit' en el array

### ORDER-LIMIT

[](#order-limit)

Las sentencias ORDER BY 'nombre\_de\_columna' LIMIT 'numero\_de\_filas' se pueden obtener agregando a cualquier clase Select o Join la terminación OrderByLimit, e incluir en el array ambos campos:

SELECT \* FROM prueba ORDER BY id LIMIT 10

```
$datos = [
    'tabla' => 'prueba',
    'campos' => ['*'],
    'order' => 'id',
    'limit' => '10' // Limit tiene que ser numérico pero String
];
$select = $factory->crear('src\factory\SelectOrderByLimit', $datos);
```

### TRUNCATE

[](#truncate)

Borra todos los datos de la tabla sin eliminar la tabla

```
$truncate = $factory->crear('src\factory\Truncate',['tabla'=>'prueba']);
```

### EJECUTAR LA CONSULTA

[](#ejecutar-la-consulta)

Al ejecutar cada consulta SELECT, UPDATE, INSERT, DELETE, JOIN, O CUALQUIER OTRA:

```
$select->obtener();
```

### RESULTADOS DE SELECT

[](#resultados-de-select)

Contar los resultados de un select

```
/*
ejecutamos la consulta
$consulta = $select->obtener();
*/

$resultado = new ContarResultados;
$resultado->contar($consulta);
```

Devuelve objetos

```
$resultadoObj = new ResultadoEnObjetos;
$resultadoObj->resultado($consulta);
```

Devuelve arrays

```
$resultadoArray = new ResultadoEnArrays;
$resultadoArray->resultado($consulta);
```

Devuelve string en formato JSON

```
$resultadoJson = new ResultadoEnJson;
$resultadoJson->resultado($consulta);
```

### RESULTADOS DE INSERT

[](#resultados-de-insert)

ContarResultados devuelve el número de filas afectadas por la consulta ejecutada

```
$insert = $factory->crear('src\factory\Insert',[
    'tabla' => 'prueba',
    'valores' => ['uno' => 1234, 'dos' => 1234, 'tres' => 1548]
]);

$resultado = new ContarResultados;
var_dump($resultado->contar($insert->obtener())); // OUTPUT 1
```

### Estructura de directorios

[](#estructura-de-directorios)

```
pdo-database
+-- src
|   +-- excepciones             //Contiene todas las Excepciones a lanzar
|   +-- factory                 //Contiene las clases para generar las peticiones a SQL sin mucho código
|   +-- interfaces              //Contiene las interfaces de todo el proyecto
|   +-- pdodatabase             //Contiene todas las clases para construir y hacer las peticiones
|       |   +-- conexion        //Contiene las clases para crear la conexión
|       |   +-- consultas       //Contiene las clases para realizar las consultas
|           |   +-- select
            |   +-- sql         //Contiene clases para ejecutar varios tipos de consultas SQL
            |   +-- update
            |   +-- insert
            |   +-- delete
|       |   +-- ejecutar        //Contiene las clases para ejecutar las consultas
|       |   +-- elementos       //Contiene las clases para construir las sentencias
|       |   +-- resultados      //Contiene las clases para mostrar resultados
|       |   +-- sentencias      //Contiene las clases para construir las sentencias en texto
|           |   +-- select
            |   +-- sql         //Contiene clases para construir varias sentencias SQL
            |   +-- update
            |   +-- insert
            |   +-- delete
+-- test                        //Contiene las pruebas realizadas en PHPUnit
+-- test.sql                    //Archivo SQL que contiene la creación de las tablas necesarias para las pruebas

```

ejemplos de uso
---------------

[](#ejemplos-de-uso)

```
