Herramientas de usuario

Herramientas del sitio


proyectos:registro_comidas

Diferencias

Muestra las diferencias entre dos versiones de la página.

Enlace a la vista de comparación

Ambos lados, revisión anteriorRevisión previa
Próxima revisión
Revisión previa
proyectos:registro_comidas [2025/03/30 15:41] – [Controlador] tempwinproyectos:registro_comidas [2025/03/30 18:54] (actual) – [Migración] tempwin
Línea 13: Línea 13:
  
 ===== Estructura de base de datos ===== ===== Estructura de base de datos =====
 +
 +==== Tipos de comida ====
 +
 +  * id
 +  * nombre
 +  * slug
 +  * descripción
  
 ==== Comidas ==== ==== Comidas ====
Línea 72: Línea 79:
 </WRAP> </WRAP>
  
 +===== Tipos de comida =====
 +
 +Según el momento del día:
 +
 +  * Desayuno
 +  * Comida
 +  * Cena
 +  * Tentempié / picoteo / snack
 +
 +==== Migración ====
 +
 +<code>
 +php artisan make:migration create_meal_types_table
 +</code>
 +
 +Contenido del fichero ''database/migrations/2025_03_30_164255_create_meal_types_table.php'':
 +
 +<code php>
 +<?php
 +
 +use Illuminate\Database\Migrations\Migration;
 +use Illuminate\Database\Schema\Blueprint;
 +use Illuminate\Support\Facades\Schema;
 +
 +return new class extends Migration
 +{
 +    /**
 +     * Run the migrations.
 +     */
 +    public function up(): void
 +    {
 +        Schema::create('meal_types', function (Blueprint $table) {
 +            $table->id();
 +            $table->string('name');
 +            $table->string('slug')->unique();
 +            $table->text('description')->nullable();
 +            $table->timestamps();
 +        });
 +    }
 +
 +    /**
 +     * Reverse the migrations.
 +     */
 +    public function down(): void
 +    {
 +        Schema::dropIfExists('meal_types');
 +    }
 +};
 +
 +</code>
 +
 +==== Modelo ====
 +
 +Lo creamos con: 
 +
 +<code>
 +php artisan make:model MealType 
 +</code>
 +
 +Contenido del fichero generado ''app/Models/MealType.php'':
 +
 +<code php>
 +<?php
 +
 +namespace App\Models;
 +
 +use Illuminate\Database\Eloquent\Model;
 +
 +class MealType extends Model
 +{
 +    //
 +}
 +
 +</code>
 ===== Categorías ===== ===== Categorías =====
  
Línea 77: Línea 158:
  
 <code> <code>
-php atisan make:migration create_categories_table+php artisan make:migration create_categories_table
 </code> </code>
  
Línea 121: Línea 202:
 namespace App\Models; namespace App\Models;
  
-use Illuminate\Database\Eloquent\Factories\HasFactory; 
 use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Model;
 +use Illuminate\Database\Eloquent\Factories\HasFactory;
 +
  
 class Category extends Model class Category extends Model
Línea 161: Línea 243:
   * ''destroy()''   * ''destroy()''
  
 +==== Vistas ====
 +
 +Creamos las vistas para todos los métodos del controlador menos ''store()'', ''update()'' y ''destroy()'':
 +
 +<code>
 +php artisan make:view categories.index
 +
 +php artisan make:view categories.create
 +
 +php artisan make:view categories.show
 +
 +php artisan make:view categories.edit
 +</code>
 +
 +Se habrán creado los siguientes ficheros en el directorio ''resources/views/categories'':
 +
 +  * ''index.blade.php''
 +  * ''create.blade.php''
 +  * ''show.blade.php''
 +  * ''edit.blade.php''
 +==== Rutas ====
 +
 +En el fichero ''routes/web.php'' añadimos:
 +
 +<code>
 +Route::resource('categories', CategoryController::class);
 +</code>
 +
 +Podemos verificar con el siguiente comando las rutas registradas:
 +
 +<code>
 +php artisan route:list
 +</code>
 +
 +===== Comidas =====
 +
 +==== Migración ====
 +
 +**Migración** para la tabla de las **comidas**:
 +
 +<code>
 +php artisan make:migration create_meals_table
 +</code>
 +
 +Fichero con la migración (''database/migrations/2025_03_28_210000_create_meals_table.php''):
 +
 +<code php>
 +<?php
 +
 +use Illuminate\Database\Migrations\Migration;
 +use Illuminate\Database\Schema\Blueprint;
 +use Illuminate\Support\Facades\Schema;
 +
 +return new class extends Migration
 +{
 +    /**
 +     * Run the migrations.
 +     */
 +    public function up(): void
 +    {
 +        Schema::create('meals', function (Blueprint $table) {
 +            $table->id();
 +            $table->foreignId('user_id')->nullable()->constrained()->cascadeOnDelete();
 +            $table->string('name');
 +            $table->text('description')->nullable();
 +            $table->dateTime('date_time');
 +            $table->integer('calories')->nullable();
 +            $table->enum('meal_type', ['desayuno', 'comida', 'cena', 'tentempié']);
 +            $table->foreignId('category_id')->nullable()->constrained();
 +            $table->enum('location_type', ['casa', 'fuera'])->default('casa');
 +            $table->timestamps();
 +        });
 +    }
 +
 +    /**
 +     * Reverse the migrations.
 +     */
 +    public function down(): void
 +    {
 +        Schema::dropIfExists('meals');
 +    }
 +};
 +</code>
 +
 +==== Modelo ====
 +
 +Modelo para las categorías (''app/Models/Meal.php''):
 +
 +<code php>
 +<?php
 +
 +namespace App\Models;
 +
 +use Illuminate\Database\Eloquent\Model;
 +use Illuminate\Database\Eloquent\Factories\HasFactory;
 +use Illuminate\Database\Eloquent\Relations\BelongsTo;
 +use Illuminate\Database\Eloquent\Relations\BelongsToMany;
 +
 +class Meal extends Model
 +{
 +    use HasFactory;
 +
 +    protected $fillable = [
 +        'name',
 +        'description',
 +        'date_time',
 +        'meal_type',
 +        'user_id'
 +    ];
 +
 +    protected $casts = [
 +        'date_time' => 'datetime',
 +    ];
 +
 +    // Relaciones
 +    public function user(): BelongsTo
 +    {
 +        return $this->belongsTo(User::class);
 +    }
 +
 +    public function category(): BelongsTo
 +    {
 +        return $this->belongsTo(Category::class);
 +    }
 +
 +    public function ingredients(): BelongsToMany
 +    {
 +        return $this->belongsToMany(Ingredient::class)
 +            ->withPivot('quantity')
 +            ->withTimestamps();
 +    }
 +
 +    public function tags(): BelongsToMany
 +    {
 +        return $this->belongsToMany(Tag::class)
 +            ->withTimestamps();
 +    }
 +
 +    // Accesor para el lugar
 +    public function getLocationAttribute(): string
 +    {
 +        return match($this->location_type) {
 +            'casa' => 'En casa',
 +            'casa_familiar' => 'Casa de familiar',
 +            'restaurante' => $this->restaurant ?? 'Restaurante',
 +            default => 'Desconocido'
 +        };
 +    }
 +}
 +</code>
 +
 +==== Controlador ====
 +
 +Creamos un controlador asociado al modelo de las categorías:
 +
 +<code>
 +php artisan make:controller MealController -m Meal
 +</code>
 +
 +Se creará el fichero ''app/Http/Controllers/MealController.php'' con la firma de los 7 métodos:
 +
 +  * index()
 +  * create()
 +  * store()
 +  * show()
 +  * edit()
 +  * update()
 +  * destroy()
 +
 +==== Vistas ====
 +
 +Creamos las vistas para todos los métodos del controlador menos ''store()'', ''update()'' y ''destroy()'':
 +
 +<code>
 +php artisan make:view meals.index
 +
 +php artisan make:view meals.create
 +
 +php artisan make:view meals.show
 +
 +php artisan make:view meals.edit
 +</code>
 +
 +Se habrán creado los siguientes ficheros en el directorio ''resources/views/meals'':
 +
 +  * ''index.blade.php''
 +  * ''create.blade.php''
 +  * ''show.blade.php''
 +  * ''edit.blade.php''
 +
 +==== Rutas ====
 +
 +En el fichero ''routes/web.php'' añadimos:
 +
 +<code php>
 +Route::resource('meals', MealController::class);
 +</code>
 +
 +Podemos verificar con el siguiente comando las rutas registradas:
 +
 +<code>
 +php artisan route:list
 +</code>
  
proyectos/registro_comidas.1743342095.txt.gz · Última modificación: por tempwin