====== Convenciones utilizadas en Laravel ====== [[informatica:programacion:php:frameworks:laravel|Laravel]] prioriza "convención sobre configuración", así que seguir sus estándares te ahorrará tiempo. ===== Estructura de directorios ===== * ''app/Models'': modelos * ''resources/views'': vistas. * ''app/Http/Controllers'': controladores. * ''database/migrations'': migraciones. * ''routes'': definición de rutas. * ''config'': archivos de configuración. ===== Nombrado de ficheros ===== * **Modelos**: Singular y //PascalCase// (ej: ''User'', ''ProductCategory''). * ** Controladores**: Sufijo //Controller// (ej: ''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: class User extends Model { protected $table = 'mis_usuarios'; // Sobrescribe la convención } ==== 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: class User extends Model { protected $primaryKey = 'user_id'; } ==== 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: class Comment extends Model { public function post() { return $this->belongsTo(Post::class, 'mi_post_id'); // Clave foránea personalizada } } ==== 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: class User extends Model { public $timestamps = false; } ==== 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.