Cómo utilizar programación funcional en la gestión de bases de datos en PHP

Despliegue en servidores web
Cómo utilizar programación funcional en la gestión de bases de datos en PHP La programación funcional es un paradigma que se basa en programar utilizando funciones puras, es decir, funciones que no tienen efectos secundarios y siempre devuelven el mismo resultado ante los mismos parámetros. En este artículo se explorará cómo utilizar programación funcional en la gestión de bases de datos en PHP. Para ello, se utilizará el framework Laravel, que permite utilizar programación funcional en la gestión de bases de datos gracias a Eloquent ORM.

1. ¿Qué es Eloquent ORM?

Eloquent ORM es una herramienta de programación en Laravel que permite realizar operaciones sobre bases de datos de forma sencilla mediante el uso de modelos. Se trata de un ORM (Object Relational Mapping) que se encarga de mapear las tablas de la base de datos con objetos de PHP y proporciona una forma sencilla de realizar operaciones CRUD (Create, Read, Update, Delete) sobre la base de datos. Además, Eloquent ORM permite utilizar programación funcional en la gestión de bases de datos gracias a sus métodos encadenables.

2. Métodos encadenables en Eloquent ORM

Los métodos encadenables son aquellos que devuelven el objeto que los llama, lo que permite encadenar varios de ellos en una misma línea de código. En Eloquent ORM, hay varios métodos encadenables que permiten utilizar programación funcional en la gestión de bases de datos. En las siguientes secciones se detallarán algunos ejemplos de estos métodos.

2.1. where()

El método where() de Eloquent ORM se utiliza para filtrar los resultados de una consulta mediante una condición. Este método acepta dos parámetros: el nombre de la columna a filtrar y el valor que se desea buscar en dicha columna. Por ejemplo, supongamos que tenemos una tabla llamada "users" y queremos buscar todos los usuarios que tengan el campo "name" igual a "John". Podemos hacerlo mediante la siguiente consulta:
 $users = DB::table('users')
                   ->where('name', 'John')
                   ->get();
En este ejemplo, se utiliza el método where() para filtrar los resultados de la consulta mediante la condición "name = 'John'".

2.2. orderBy()

El método orderBy() de Eloquent ORM se utiliza para ordenar los resultados de una consulta en base a una columna determinada. Este método acepta dos parámetros: el nombre de la columna por la que se desea ordenar y la dirección del ordenamiento (ascendente o descendente). Por ejemplo, supongamos que queremos ordenar los resultados de la consulta anterior por el campo "id" en orden descendente. Podemos hacerlo mediante la siguiente consulta:
 $users = DB::table('users')
                   ->where('name', 'John')
                   ->orderBy('id', 'desc')
                   ->get();
En este ejemplo, se utiliza el método orderBy() para ordenar los resultados de la consulta por el campo "id" en orden descendente.

2.3. select()

El método select() de Eloquent ORM se utiliza para seleccionar las columnas que deseamos recuperar en la consulta. Este método acepta como parámetro un array con los nombres de las columnas a seleccionar. Por ejemplo, supongamos que queremos seleccionar únicamente los campos "id" y "name" de los usuarios con nombre "John". Podemos hacerlo mediante la siguiente consulta:
 $users = DB::table('users')
                   ->where('name', 'John')
                   ->select(['id', 'name'])
                   ->get();
En este ejemplo, se utiliza el método select() para seleccionar únicamente los campos "id" y "name".

3. Funciones anónimas en Eloquent ORM

Además de los métodos encadenables, Eloquent ORM permite utilizar funciones anónimas para aplicar programación funcional en la gestión de bases de datos. Las funciones anónimas se utilizan principalmente como parámetros de otros métodos, como por ejemplo en el método where(). En el siguiente ejemplo, se utiliza una función anónima para filtrar los resultados de una consulta:
 $users = DB::table('users')
                   ->where(function($query) {
                       $query->where('name', 'like', '%John%')
                             ->orWhere('name', 'like', '%Jane%');
                   })
                   ->get();
En este ejemplo, se utiliza una función anónima como parámetro del método where(). Esta función anónima recibe como parámetro un objeto QueryBuilder, que se utiliza para construir la consulta. En este caso, se utiliza el objeto QueryBuilder para construir una condición que busca todos los usuarios cuyo nombre contenga "John" o "Jane".

4. Ejemplo práctico: sistema de votación

Para ilustrar cómo utilizar programación funcional en la gestión de bases de datos en PHP, se presenta un ejemplo práctico de un sistema de votación hecho en Laravel con Eloquent ORM. Supongamos que queremos implementar un sistema de votación en el que los usuarios pueden votar por sus películas favoritas, y queremos mostrar las películas ordenadas por el número de votos. Lo primero que debemos hacer es crear una tabla "movies" y una tabla "votes". La tabla "movies" tendrá los siguientes campos: "id", "title" y "votes". La tabla "votes" tendrá los siguientes campos: "id", "movie_id" y "user_id". El campo "movie_id" será una llave foránea que hará referencia a la tabla "movies". Una vez creadas las tablas, creamos el modelo "Movie" con el siguiente comando de Artisan:
 $ php artisan make:model Movie
En el modelo "Movie" creamos el siguiente método para obtener las películas ordenadas por el número de votos:
 public function getMoviesOrderByVotes() {
    return Movie::leftJoin('votes', 'movies.id', '=', 'votes.movie_id')
                ->select('movies.id', 'movies.title', DB::raw('COUNT(votes.id) as votes'))
                ->groupBy('movies.id', 'movies.title')
                ->orderBy('votes', 'desc')
                ->get();
 }
En este método, se utiliza el método leftJoin() de Eloquent ORM para unir las tablas "movies" y "votes", y así obtener el número de votos por película. La función anónima que se le pasa como parámetro a leftJoin() construye la condición para unir las tablas mediante la llave foránea "movie_id". En el método también se utiliza la función DB::raw() para permitir la selección de campos calculados, como en este caso el número de votos por película. Finalmente, se utiliza la función groupBy() para agrupar los resultados por película y ordenarlos por el número de votos en orden descendente. Para registrar un voto, creamos el siguiente método en el controlador "VoteController":
 public function store(Request $request) {
    $vote = new Vote;
    $vote->movie_id = $request->input('movie_id');
    $vote->user_id = Auth::user()->id;
    $vote->save();

    $movie = Movie::find($request->input('movie_id'));
    $movie->votes++;
    $movie->save();

    return redirect('/votes');
 }
En este método, se crea un nuevo objeto Vote con las datos del formulario, se registra el voto en la base de datos y se actualiza la cantidad de votos de la película correspondiente.

5. Conclusiones

En este artículo se ha explorado cómo utilizar programación funcional en la gestión de bases de datos en PHP con el framework Laravel y Eloquent ORM. Se ha demostrado cómo los métodos encadenables y las funciones anónimas pueden utilizarse para construir consultas complejas con una sintaxis sencilla y legible. Además, se ha presentado un ejemplo práctico de un sistema de votación que utiliza programación funcional en la gestión de bases de datos con Eloquent ORM. En definitiva, se ha demostrado cómo la programación funcional puede ser una herramienta muy útil en la gestión de bases de datos en PHP.