Curso de Laravel
Configuración de base de datos en Laravel
Por Víctor Peña · Publicado el
Hola, ¿cómo están? Empezamos el módulo de base de datos, que es el corazón de cualquier aplicación. Hoy conectamos Laravel con MySQL.
¡Empecemos!
Dónde vive la configuración
Laravel separa la configuración en dos lugares, y entender esa división evita muchos problemas:
config/database.phpdefine cómo se conecta: los drivers disponibles, sus opciones y cuál es el predeterminado..envguarda los valores concretos: host, usuario, contraseña. Es lo que cambia entre tu máquina y el servidor.
Esta separación existe porque config/ se versiona en Git y el .env no.
Configurar MySQL
Abre el .env y ajusta estas líneas:
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=clinica
DB_USERNAME=root
DB_PASSWORD=
Antes de nada, la base tiene que existir. Desde MySQL:
CREATE DATABASE clinica
CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;
Como vimos en el curso de MySQL, el utf8mb4 no es opcional: es lo que evita que las tildes y los emojis se conviertan en símbolos raros.
Un detalle sobre el host
Usa 127.0.0.1 y no localhost. Son casi lo mismo, pero localhost puede hacer que PHP intente conectarse por socket Unix en lugar de por red, y eso falla en algunas configuraciones con un error confuso.
Si cambiaste el puerto de MySQL
Si tuviste que moverlo por un conflicto de puertos, ajústalo aquí:
DB_PORT=3307
Probar la conexión
La forma más rápida:
php artisan migrate
Si crea las tablas iniciales, la conexión funciona.
Y para ver un resumen del estado:
php artisan db:show
Devuelve el motor, la versión, el nombre de la base, cuántas tablas tiene y su tamaño. Es el comando que uso para confirmar que estoy apuntando a la base correcta.
También puedes entrar directamente a la consola de MySQL sin salir del proyecto:
php artisan db
No uses root en la aplicación
Esto lo desarrollamos en la lección de seguridad de MySQL, y aplica igual aquí.
El usuario root puede borrar bases enteras. Tu aplicación solo necesita consultar, insertar, actualizar y eliminar registros:
CREATE USER 'app_clinica'@'localhost' IDENTIFIED BY 'una-clave-larga';
GRANT SELECT, INSERT, UPDATE, DELETE ON clinica.* TO 'app_clinica'@'localhost';
FLUSH PRIVILEGES;
Con ese usuario en el .env, un fallo de seguridad en la aplicación no puede destruir la base.
En desarrollo conviene un segundo usuario con permisos de estructura, porque las migraciones sí necesitan crear y modificar tablas.
El archivo config/database.php
Aunque casi nunca lo edites, vale la pena saber qué hay dentro:
'default' => env('DB_CONNECTION', 'sqlite'),
'connections' => [
'mysql' => [
'driver' => 'mysql',
'host' => env('DB_HOST', '127.0.0.1'),
'database' => env('DB_DATABASE'),
'charset' => 'utf8mb4',
'collation' => 'utf8mb4_unicode_ci',
'strict' => true,
// ...
],
],
Dos opciones que conviene conocer:
strict => true activa el modo estricto de MySQL, que rechaza operaciones ambiguas en lugar de aceptarlas en silencio. Es lo que hace que una consulta con GROUP BY mal formada falle en vez de devolver datos arbitrarios. Déjalo activado.
El charset y la collation ya vienen correctos. No los cambies a utf8 a secas.
Laravel soporta además PostgreSQL, SQLite, SQL Server y MariaDB. Cambiar de motor es, en la mayoría de casos, cambiar DB_CONNECTION.
SQLite para pruebas
Aquí hay algo que vale mucho la pena conocer.
SQLite es una base de datos que vive en un solo archivo. No requiere servidor ni configuración, y Laravel la trae lista:
DB_CONNECTION=sqlite
touch database/database.sqlite
php artisan migrate
Dónde brilla: en las pruebas automatizadas. Con SQLite en memoria, la base se crea y se destruye en cada prueba, y todo corre en milisegundos.
En phpunit.xml:
<env name="DB_CONNECTION" value="sqlite"/>
<env name="DB_DATABASE" value=":memory:"/>
Dónde no: en producción con varios usuarios escribiendo a la vez. SQLite bloquea el archivo completo al escribir.
Varias conexiones a la vez
Un caso real: tu aplicación nueva convive con un sistema antiguo y hay que leer datos de su base.
// config/database.php
'sistema_antiguo' => [
'driver' => 'mysql',
'host' => env('DB_ANTIGUO_HOST'),
'database' => env('DB_ANTIGUO_DATABASE'),
'username' => env('DB_ANTIGUO_USERNAME'),
'password' => env('DB_ANTIGUO_PASSWORD'),
],
Y al usarla:
// Con Query Builder
DB::connection('sistema_antiguo')->table('clientes')->get();
// O fijada en un modelo
class ClienteAntiguo extends Model
{
protected $connection = 'sistema_antiguo';
}
Ver las consultas que se ejecutan
Muy útil para entender qué está haciendo Eloquent por debajo. En AppServiceProvider:
use Illuminate\Support\Facades\DB;
public function boot(): void
{
if (app()->environment('local')) {
DB::listen(function ($query) {
logger($query->sql, $query->bindings);
});
}
}
Cada consulta queda registrada en storage/logs/laravel.log. Fíjate en la condición: solo en local. En producción llenaría el log en minutos.
Es la forma más directa de detectar el problema N+1 mientras desarrollas.
Errores frecuentes
«Access denied for user». Credenciales incorrectas. Y muy importante: después de cambiar el .env, ejecuta php artisan config:clear. Laravel cachea la configuración y sigue usando la vieja.
«Unknown database». La base no existe. Créala en MySQL antes de migrar.
«Connection refused». MySQL no está iniciado, o el puerto no coincide.
«could not find driver». Falta la extensión pdo_mysql en PHP. Actívala en el php.ini.
Cambié el .env y no pasa nada. Es lo mismo del primer punto: limpia la configuración cacheada.
Uso env() y en producción devuelve null. Este merece explicación aparte.
env() frente a config()
Es de los errores más difíciles de diagnosticar, así que conviene tenerlo claro desde ahora.
// Mal: fuera de config/ deja de funcionar en producción
$host = env('DB_HOST');
// Bien
$host = config('database.connections.mysql.host');
Cuando en producción se ejecuta php artisan config:cache, Laravel compila toda la configuración en un archivo y deja de leer el .env. A partir de ahí, cualquier env() fuera de la carpeta config/ devuelve null.
La regla: env() solo dentro de config/. En el resto del código, siempre config().
Para cerrar
Conectar Laravel con MySQL es cambiar cinco líneas del .env. Lo que marca la diferencia es lo que rodea a esas líneas: un usuario con permisos limitados, utf8mb4 en la base, y usar config() en lugar de env().
Y el reflejo que te va a ahorrar horas: si cambias el .env y no ves el efecto, limpia la caché de configuración.
En la siguiente lección veremos las migraciones, que es cómo Laravel versiona la estructura de tu base de datos.
Saludos y éxitos.
Norvic Software
Desarrollamos el software que tu empresa necesita
Somos una fábrica de software en Bolivia. Construimos sistemas a medida y aplicaciones móviles, y llevamos Inteligencia Artificial a las empresas que ya tienen un sistema funcionando.
- Chatbots con Inteligencia Artificial
- Creación de agentes de IA
- Integración de IA en tus sistemas
- Desarrollo de software a medida
- Aplicaciones móviles iOS y Android
- Consultoría y asesoramiento técnico
Cotización sin costo · Respuesta directa por WhatsApp