Advertisement
  1. Code
  2. Coding Fundamentals
  3. Databases & SQL

Usando Illuminate Database Con Eloquent en Tu Aplicación PHP Sin Laravel

Scroll to top
Read Time: 13 min

() translation by (you can also view the original English article)

Illuminate es el motor de base de datos de Laravel sin Laravel. Viene en paquete con el ORM Eloquent en Laravel. Si te gustaría construir tus aplicaciones PHP con ORMs y prefieres no usar Laravel, este tutorial es para ti.

En este tutorial, vamos a construir el back end para una aplicación Q&A con PHP, Illuminate Databse y el ORM Eloquent.

Dependencias del Proyecto

  1. PHP: 5.5+
  2. MYSQL
  3. Composer

Capacidades de Aplicación

Nuestra aplicación desempeñará diez tareas:

  • Agregar un usuario.
  • Agregar una pregunta.
  • Agregar una respuesta a una pregunta.
  • Votar una respuesta.
  • Obtener una pregunta con respuestas.
  • Obtén todas las preguntas y usuarios que las hicieron.
  • Obtén preguntas, respuestas y votos particulares.
  • Cuanta preguntas de un usuario particular.
  • Actualiza una respuesta por usuario.
  • Borra una pregunta.

Primero, creamos nuestro directorio y estructura de proyecto.

En el directorio principal de proyecto, crearemos una carpeta app, y después en esta carpeta app, crearemos dos carpetas: models y controllers. En esta imagen, nuestra carpeta principal de proyecto se llama eloquent. Deberías reemplazarla con cualquier nombre que prefieras.

Our project organizationOur project organizationOur project organization

Después, creamos un archivo index.php en la carpeta principal, al mismo nivel que la carpeta app.

Usaremos git, para que podamos crear un archivo .gitignore. Nota que este paso es opcional.

Después, instalamos las dependencias necesarias para este proyecto para trabajar. En la carpeta principal del proyecto, crearemos un archivo composer.json. Después pegaremos esto en nuestro archivo composer.json.

1
{
2
 “name”: “illuminate-example/eloquent”,
3
 “description”: “Implementation of Database Queries with illuminate and Eloquent”,
4
 “type”: “project”,
5
 “require”: {}
6
}

Para instalar la base de datos Illuminate, agregamos esto a nuestro composer.json:
“illuminate/database”: “5.1.8”,.

Después, agregamos autocarga psr-4 para nuestros Modelos y controladores:

1
“autoload”: {
2
 “psr-4”: {
3
 “Controllers\\”: “app/controllers/”,
4
 “Models\\”: “app/models/” }
5
 }

Ahora, nuestro archivo composer.json debería lucir así:

1
{
2
 “name”: “illuminate-example/eloquent”,
3
 “description”: “Implementation of Database Queries with illuminate and Eloquent”,
4
 “type”: “project”,
5
 “require”: {
6
 “illuminate/database”: “5.1.8”},
7
 “autoload”: 
8
    {“psr-4”: 
9
        { “Controllers\\”: “app/controllers/”,
10
            “Models\\”: “app/models/"
11
            
12
                 }
13
    }
14
}

Ahora ejecutaremos estos dos coamandos composer en la misma ubicación que nuestro archivo composer.json:

1
composer install

2
composer dump-autoload -o

Esto generará un folder vendor que podemos agregar a gitignore (este también es un paso opcional).

Agreguemos un archivo config para nuestras credenciales de base de datos.

En el directorio principal del proyecto, creamos un archivo llamado config.php y definimos los detalles de la BD en el archivo Config.php. Nota que los valores deberían ser reemplazados con tus propios detalles de conexión.

1
<?php
2
3
defined(DBDRIVER)or define(DBDRIVER,mysql);
4
defined(DBHOST)or define(DBHOST,localhost);
5
defined(DBNAME)or define(DBNAME,eloquent-app);
6
defined(DBUSER)or define(DBUSER,root);
7
defined(DBPASS)or define(DBPASS,pass);

Después, creamos el esquema para nuestra aplicación.

Una cosa que notar antes de que creemos el esquema para las tablas en nuestra base de datos es que podemos agregar estampas de tiempo a nuestro esquema.

El ORM eloquent espera dos columnas timestamp si queremos que habiliten la operación timestamp en una tabla/modelo particular. Estas son las columnas created_at y updated_at. Si habilitamos timestamps para un modelo, Eloquent automáticamente actualiza estos campos con el tiempo cuando creamos o actualizamos un registro.

Hay una tercera columna llamada deleted_at. La estampa de tiempo deleted_at trabaja diferente, sin embargo. Eloquent tiene una capacidad de borrado suave que usa la columna deleted_at para determinar si un registro ha sido borrado. Si borras un registro con la función 'delete' de eloquent y quieres habilitar Soft Delete, la columna es actualizada con el tiempo de borrado. Estos elementos borrados pueden ser entonces recuperados en cualquier momento.

En esta aplicación, estaremos sacando ventaja de las estampas de tiempo, así que usaremos las tres en nuestro Esquema de creación.

Crea tablas con los siguientes comando en MySQL:

Preguntas

1
CREATE TABLE `questions` (
2
 `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
3
 `question` tinytext,
4
 `user_id` int(11) DEFAULT NULL,
5
 `created_at` timestamp NULL DEFAULT NULL,
6
 `updated_at` timestamp NULL DEFAULT NULL,
7
 `deleted_at` timestamp NULL DEFAULT NULL,
8
 PRIMARY KEY (`id`)
9
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Respuestas

1
CREATE TABLE `answers` (
2
 `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
3
 `answer` tinytext,
4
 `user_id` int(11) DEFAULT NULL,
5
 `question_id` int(11) DEFAULT NULL,
6
 `created_at` timestamp NULL DEFAULT NULL,
7
 `updated_at` timestamp NULL DEFAULT NULL,
8
 `deleted_at` timestamp NULL DEFAULT NULL,
9
 PRIMARY KEY (`id`)
10
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Votos

1
CREATE TABLE `upvotes` (
2
 `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
3
 `answer_id` int(11) DEFAULT NULL,
4
 `user_id` int(11) DEFAULT NULL,
5
 `created_at` timestamp NULL DEFAULT NULL,
6
 `updated_at` timestamp NULL DEFAULT NULL,
7
 `deleted_at` timestamp NULL DEFAULT NULL,
8
 PRIMARY KEY (`id`)
9
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Usuarios

1
CREATE TABLE `users` (
2
 `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
3
 `username` varchar(100) DEFAULT NULL,
4
 `email` varchar(200) DEFAULT NULL,
5
 `password` varchar(200) DEFAULT NULL,
6
 `created_at` timestamp NULL DEFAULT NULL,
7
 `updated_at` timestamp NULL DEFAULT NULL,
8
 `deleted_at` timestamp NULL DEFAULT NULL,
9
 PRIMARY KEY (`id`)
10
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Procederemos creando archivos para modelos y controladores para nuestras tablas en las siguientes ubicaciones:

  • project_folder/app/models/question.php
  • project_folder/app/models/answer.php
  • project_folder/app/models/upvote.php
  • project_folder/app/models/user.php
  • project_folder/app/models/database.php
  • project_folder/app/controllers/questions.php
  • project_folder/app/controllers/answers.php
  • project_folder/app/controllers/upvotes.php
  • project_folder/app/controllers/users.php

Abre models/database.php con un editor. 

Primero creamos la Cápsula:

1
<?php
2
3
namespace Models; 
4
use Illuminate\Database\Capsule\Manager as Capsule;
5
6
class Database {
7
8
    function __construct() {
9
    $capsule = new Capsule;
10
    $capsule->addConnection([
11
     driver => DBDRIVER,
12
     host => DBHOST,
13
     database => DBNAME,
14
     username => DBUSER,
15
     password => DBPASS,
16
     charset => utf8,
17
     collation => utf8_unicode_ci,
18
     prefix => ‘’,
19
    ]);
20
    // Setup the Eloquent ORM… 

21
    $capsule->bootEloquent();
22
}
23
24
}

En el archivo de arriba, inicializamos y configuramos la cápsula con las constantes definidas en config.php, y después iniciamos eloquent.

El siguiente paso es crear un script inicial. Este será un archivo en donde todo lo que tiene que ser ejecutado antes de nuestra app es ejecutado.

Creamos un archivo de inicio en la ubicación project_folder/start.php, y después en el archivo, requiere un archivo de auto-carga Composer:

require ‘vendor/autoload.php’;

Después de eso, requerimos config.php para obtener las credenciales definidas: require ‘config.php’;

Después inicializamos la clase de la base de datos.

1
<?php
2
3
use Models\Database;
4
5
//Boot Database Connection

6
new Database();

Tu start.php debería lucir como esto:

1
<?php
2
require config.php;
3
require vendor/autoload.php;
4
use Models\Database;
5
//Initialize Illuminate Database Connection

6
new Database();
7
?>

Incluye start.php en tu index.php ya que este será nuestro archivo principal.

Nuestro archivo index.php ahora luce así:

1
<?php
2
require start.php;
3
?>

Después, podemos comenzar a trabajar sobre nuestros controladores y modelos. En project_folder/app/models/question.php, agregamos esto:

1
<?php
2
3
namespace Models;
4
5
use \Illuminate\Database\Eloquent\Model;
6
7
class Question extends Model {
8
    
9
    protected $table = questions;
10
    
11
}
12
13
?>

Después en project_folder/app/controllers/questions.php:

1
<?php
2
namespace Controllers;
3
4
class Questions{
5
    
6
}
7
8
?>

En project_folder/app/controllers/answers.php, hacemos lo mismo:

1
<?php
2
namespace Controllers;
3
4
class Answers{
5
    
6
}
7
?>

Tarea 1: Agrega un Usuario

En el modelo usuario (project_folder/app/models/user.php), agregamos el siguiente código para definir nuestro namespace, extender el Modelo Eloquent y definir el nombre de la tabla (protected $table) y qué campos en las tablas pueden ser llenados por creación masiva (protected $fillable). 

1
<?php
2
namespace Models;
3
use \Illuminate\Database\Eloquent\Model;
4
5
class User extends Model {
6
    protected $table = users;
7
    protected $fillable = [username,email,pass];
8
}
9
?>

En el controlador de usuarios (project_folder/app/controllers/user.php), definimos nuestro namespace y clase como es usual:

1
<?php
2
namespace Controllers;
3
4
class Users{
5
    
6
}
7
?>

Después para crear un usuario, en el controlador de usuarios, importamos el namespace de Modelo de usuario, use Models\User;, y después agregamos una función para crear el usuario.

1
<?php
2
3
    public static function create_user($username, $email, $password){
4
        $user = User::create(['username'=>$username,'email'=>$email,'password'=>$password]);
5
        return $user;
6
    }

Nuestro controlador de usuario luce así:

1
<?php
2
3
namespace Controllers;
4
use Models\User;
5
6
class Users {
7
    
8
    public static function create_user($username, $email, $password){
9
        $user = User::create(['username'=>$username,'email'=>$email,'password'=>$password]);
10
        return $user;
11
    }
12
}
13
?>

Después en index.php, agregamos estas líneas y ejecutamos la aplicación para crear un nuevo usuario.

1
<?php
2
3
use Controllers\Users; 
4
5
// Import user controller

6
$user = Users::create_user(user1,user1@example.com,user1_pass);

Tarea 2: Agrega una Pregunta

Para agregar una pregunta importamos el namespace de modelo Pregunta en el controlador de preguntas, y escribimos una función create_question:

use Models\Question;

Después:

1
<?php
2
3
public static function create_question($question,$user_id){
4
5
    $question = Question::create(['question'=>$question,'user_id'=>$user_id]);
6
    return $question;
7
}

Hemos usado modelos de creación masiva de Eloquent para insertar este registro, pero antes de que funciones, necesitamos permitir que esos campos sean llenables, porque los modelos de Eloquent protegen contra creación masiva por defecto.

Así que vamos al modelo question y agregamos la propiedad protected $fillable a la clase.

protected $fillable = ['question','user_id'];

Para ejecutar esto, importa el controlador de preguntas en index.php y llama a la función create_question de manera estática:

use Controllers\Question;

Después crea una pregunta con una pregunta y Id de Usuario como parámetros:

$question = Questions::create_question("Have you ever met your doppelganger?",1);

Esto devuelve un objeto modelo si es exitoso.

Ahora ejecutaremos el script index.php con diferentes entradas para agregar más preguntas a la base de datos.

Tarea 3: Agrega una Respuesta a una Pregunta

En el modelo respuesta, repetimos los pasos tomados para los modelos pregunta y usuario agregando el código de abajo:

1
<?php
2
namespace Models;
3
use \Illuminate\Database\Eloquent\Model;
4
5
class Answer extends Model {
6
    
7
    protected $table = answers;
8
    protected $fillable = [answer,user_id,question_id];
9
    
10
}
11
?>

Después en el controlador de respuestas, escribimos estas líneas:

1
<?php
2
3
namespace Controllers;
4
use Models\Answer;
5
6
7
class Answers {
8
9
    public static function add_answer($answer,$question_id,$user_id){
10
        $answer = Answer::create(['answer'=>$answer,'question_id'=>$question_id,'user_id'=>$user_id]);return $answer;
11
    }
12
}
13
14
?>

Después en index.php, podemos crear una respuesta para la pregunta con id 1 que agregamos anteriormente, con user id 2. No olvides importar el controlador respuestas a index.php primero.

1
<?php
2
3
use Controllers\Answers;
4
5
    $answers = Answers::add_answer(This is an answer,1,2);

Para prevenir múltiples entradas, comenta todas las otras llamadas en index.php antes de ejecutar una nueva.

Tarea 4: Vota una Respuesta

Estos son prácticamente los mismos pasos a los que estamos acostumbrados.

Así que copiaremos esto al modelo Upvote en project_folder/app/models/upvote.php.

1
<?php 
2
namespace Models;
3
4
use \Illuminate\Database\Eloquent\Model;
5
6
7
class Upvote extends Model {
8
9
    protected $table = 'upvotes';
10
    protected $fillable = ['answer_id','user_id'];
11
     
12
}
13
 ?>

Después en el controlador respuestas, importamos el Upvote Model namespace.

use Models\Upvote;

Después creamos una función upvote_answer.

1
<?php
2
3
    public static function upvote_answer($answer_id,$user_id){
4
        $upvote = Upvote::create(['answer_id'=>$answer_id,'user_id'=>$user_id]);
5
        return $upvote;
6
    }

En index.php, podemos llamar la función con un User ID dummy para votar la respuesta con id 1.

$upvote = Answers::upvote_answer(1,14);

Task 5: Obtén una Pregunta Con Respuestas

Para tareas como esta, podemos usar relaciones Eloquent.

Los tipos de relaciones incluyen uno a uno, uno a muchos, muchos a muchos, etc.

Cuando usamos estas relaciones, Eloquent asume una llave foránea en la forma que modelname_id existe en los modelos. Para esta tarea, la relación es una relación uno-a-muchos porque una sola pregunta puede poseer cualquier cantidad de respuestas.

Primero definimos esta relación agregando esta función a nuestro modelo pregunta.

1
<?php
2
3
public function answers()
4
{
5
    return $this->hasMany('\Models\Answer');
6
}

Después en el controlador preguntas, escribimos una función para obtener preguntas con respuestas.

1
<?php
2
3
public static function get_questions_with_answers(){
4
 
5
    $questions = Question::with('answers')->get()->toArray();
6
    return $questions;
7
}

Esto trae las preguntas con sus respuestas correspondientes.

En index.php, comentamos todas las otras llamadas y ejecutamos:

$all = Questions::get_questions_with_answers();

Podemos hacer var_dump o print_r a la variable $all para ver los resultados.

Tarea 6: Obtén Todas las Preguntas y Usuarios Que Las Hicieron

Esta es una relación uno a uno porque una pregunta tiene un usuario, así que agregamos esto al modelo pregunta.

1
<?php
2
3
public function user()
4
{
5
    return $this->belongsTo(‘\Models\User);
6
}

Después creamos una función en el controlador preguntas y usamos la función with en el modelo pregunta.

1
<?php
2
3
public static function get_questions_with_users(){
4
5
    $questions = Question::with('user')->get()->toArray();
6
    return $questions; 
7
}

En index.php, comentamos todas las demás y ejecutamos esto:

$all_with_users = Questions::get_questions_with_users();

Tarea 7: Obtén Una Pregunta Con Respuestas y Votos

Primero, definimos una relación entre respuestas y votos. Una respuesta tiene muchos votos, así que la relación es uno a muchos.

Así que agregamos la siguiente función a nuestro modelo respuesta:

1
<?php
2
3
public function upvotes()
4
{
5
    return $this->hasMany('\Models\Upvote');
6
}

Después en el controlador preguntas, creamos la función para obtener esto:

1
<?php
2
3
public static function get_question_answers_upvotes($question_id){
4
5
    $questions = Question::find($question_id)->answers()->with('upvotes')->get()->toArray();
6
    return $questions;
7
}

Como en los pasos anteriores, comentamos todas las otras llamadas para index.php y ejecutamos esto:

$one_question = Questions::get_question_answers_upvotes(1);

Podemos imprimir la variable $one_question para ver los resultados.

Tarea 8: Cuenta Todas las Preguntas de un Usuario Particular

Primero importamos el modelo pregunta en los controladores de usuarios:

use Models\Question;

Después escribimos esta función:

1
<?php
2
3
public static function question_count($user_id){
4
5
    $count = Question::where('user_id',$user_id)->count();
6
    return $count;
7
}

En index.php, comentamos otras llamadas y agregamos esta línea:

$user_question_count = Users::question_count(1);

Esto devuelve un entero que es el número de preguntas que han sido agregadas por un usuario con id 1.

Podemos imprimir la variable $user_question_count y ejecutar index.php para ver los resultados.

Tarea 9: Actualiza la Respuesta por Usuario

El concepto de actualizar con el ORM Eloquent es bastante simple. Primero, encontramos un registro, y después lo mutamos y guardamos.

Ahora, en los controladores de respuestas, agregamos esta función:

1
<?php
2
3
public static function update_answer($answer_id,$new_answer){
4
    $answer = Answer::find($answer_id);
5
    $answer->answer = $new_answer;
6
    $updated = $answer->save();
7
    return $updated;
8
}

En index.php, podemos comentar todas las otras llamadas, y actualizar la respuesta con id 1 como esto:

$update_answer = Answers::update_answer(1,”This is an updated answer”);

Esto devuelve un valor booleano--true--si la actualización es exitosa.

Tarea 10: Borra una Pregunta (Borrado Suave)

En esta tarea final, vamos a implementar Eloquent SoftDelete.

Primero le decimos al modelo pregunta que use SodtDeletes importando en namespace SoftDeletes, y después usando la característica SoftDeletes en nuestra clase.

use Illuminate\Database\Eloquent\SoftDeletes;

Después de la línea de declaración de la clase, agrega esta línea:

use SoftDeletes;

Después agregamos delete_at a la propiedad protected $dates para el modelo. Estos son los pasos requeridos.

protected $dates = [‘deleted_at’];

Nuestro modelo pregunta ahora se ve así:

1
<?php 
2
namespace Models;
3
use \Illuminate\Database\Eloquent\Model;
4
use Illuminate\Database\Eloquent\SoftDeletes;
5
class Question extends Model {
6
7
use SoftDeletes; 
8
    protected $table = 'questions';
9
    protected $fillable = ['question','user_id'];
10
11
12
    public function answers()
13
    {
14
        return $this->hasMany('\Models\Answer');
15
    }
16
    
17
    
18
    public function user()
19
    {
20
        return $this->belongsTo('\Models\User');
21
    }
22
23
 }
24
25
 ?>

Después creamos la función delete_question en el controlador preguntas.

1
<?php
2
3
public static function delete_question($question_id){
4
5
    $question = Question::find($question_id);
6
    $deleted = $question->delete();
7
    return $deleted; 
8
9
}

Ejecuta en index.php:

$delete = Questions::delete_question(1);

¡Felicidades! Acabas de construir un back end totalmente funcional con Illuminate y Eloquent. Y no tuvimos que escribir tanto código para lograrlo.

El código para este tutorial puede ser encontrado en GitHub.

Conclusión

Illuminate también viene con el Query Builder que puedes usar para consultas a la base de datos incluso más complejas y es definitivamente algo con lo que quieres experimentar y usar en tu aplicación.

La última cosa faltante en la Illuminate Database autónoma es migración de bases de datos, la cuál es una característica encantadora de Laravel. Deberías considerar usar ambas en tus aplicaciones para tomar las ventajas de las útiles características que vienen con estas.

Puedes averiguar más sobre Eloquent en la Página de Documentación Oficial de Eloquent.

Referencias

Advertisement
Did you find this post useful?
Want a weekly email summary?
Subscribe below and we’ll send you a weekly email summary of all new Code tutorials. Never miss out on learning about the next big thing.
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.