Laravel prioriza “convención sobre configuración”, así que seguir sus estándares te ahorrará tiempo.
app/Models: modelosresources/views: vistas.app/Http/Controllers: controladores.database/migrations: migraciones.routes: definición de rutas.config: archivos de configuración.User, ProductCategory).UserController).
* *Migraciones*: create_users_table → genera tabla users.
===== Bases de datos =====
==== Nombres de tablas ====
Por defecto, Laravel asume que el nombre de la tabla corresponde al *plural en inglés* del modelo asociado, en snake_case (minúsculas y separado por guiones bajos) si tiene más de una palabra.
Ejemplos:
^ Modelo ^ Tabla ^
| User | users |
| PostComment | post_comments |
| ProductCategory | product_categories |
Si nuestras tablas no siguen esta regla, podemos definir el nombre manualmente en el modelo estableciendo una propiedad privada con el nombre de la tabla:
<code php>
class User extends Model {
protected $table = 'mis_usuarios'; // Sobrescribe la convención
}
</code>
==== Tablas Pivote ====
Para relaciones muchos a muchos (Many-to-Many), Laravel espera una tabla intermedia (pivote) con los nombres de las dos tablas relacionadas *en orden alfabético*, en singular y unidos por un guion bajo.
Por ejemplo:
^ Modelos ^ Tabla pivote ^
| User y Role | role_user |
| Post y Tag | post_tag |
==== Claves primarias ====
Por defecto, Laravel espera una columna llamada id como clave primaria.
Si nuestra tabla usa otro nombre como clave primaria, hay que definir una propiedad protected $primaryKey en el modelo correspondiente:
<code php>
class User extends Model {
protected $primaryKey = 'user_id';
}
</code>
==== Claves foráneas ====
Laravel asume que la clave foránea se llama nombre_modelo_en_singular_id en snake_case.
Por ejemplo, si un Comment pertenece a un Post, la clave foránea será post_id
Si queremos personalizarlo, podemos hacerlo en las relaciones:
<code php>
class Comment extends Model {
public function post() {
return $this→belongsTo(Post::class, 'mi_post_id'); // Clave foránea personalizada
}
}
</code>
==== Timestamps automáticos ====
Laravel espera columnas created_at y updated_at en tus tablas para gestionar fechas automáticamente.
Si no las usas, podemos indicarlo en el modelo:
<code php>
class User extends Model {
public $timestamps = false;
}
</code>
==== Columnas en Snake Case ====
Todas las columnas de la base de datos deben definirse en snake_case para que Eloquent las mapee correctamente a propiedades en camelCase en los modelos.
Por ejemplo, la columna published_at corresponde a la propiedad del modelo Post $post→published_at.
===== ¿Qué pasa si no sigo las convenciones? =====
Puedes personalizar todo, pero tendrás que escribir más código (ej: definir manualmente claves foráneas, nombres de tablas, etc.). Seguir las convenciones ahorra tiempo y evita errores.