【问题标题】:How do I correctly set up a way for users to set up a meal plan?如何正确设置用户设置膳食计划的方式?
【发布时间】:2021-07-26 09:58:28
【问题描述】:

我正在尝试为用户建立一个基本的方式来创建一周的膳食计划。我尝试了几种方法,但由于这是我的第一个项目,我严重卡住了 atm。

所以下面我将展示我所采取的步骤并解释我的想法。

create_meal_plans_table.php

我喜欢让表格尽可能简单,但这可能是我的失败。我最初将星期一到星期五的日期显示为单独的字符串,但它很混乱,并决定将它放在它自己的一天的表格中。

然后我添加了一个标题,这样他们就可以在用户个人资料中从下拉列表中选择一个特定的膳食计划,然后它就会显示出来。

剩下的不言自明。

<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class CreateMealPlansTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('meal_plans', function (Blueprint $table) {
            $table->id();
            $table->unsignedBigInteger('user_id');
            $table->unsignedBigInteger('day_id');
            $table->string('title');
            $table->string('breakfast');
            $table->string('lunch');
            $table->string('dinner');
            $table->string('snack');

            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('meal_plans');
    }
}

create_days_table

我不确定将日期保留为字符串是否正确。

<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class CreateDaysTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('days', function (Blueprint $table) {
            $table->id();
            $table->mediumText('monday'); //medium height text
            $table->mediumText('tuesday'); //medium height text
            $table->mediumText('wednesday'); //medium height text
            $table->mediumText('thursday'); //medium height text
            $table->mediumText('friday'); //medium height text
            $table->mediumText('saturday'); //medium height text
            $table->mediumText('sunday'); //medium height text
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('days');
    }
}

膳食/create.blade.php

我将截屏它的外观并在下面显示它,而不是解释这一点。

@extends('layouts.app')

@section('content')

    <head>

        <style>

            table .button {
                background-color: transparent;
                border: none;
                color: black;
                padding: 16px 32px;
                text-align: center;
                text-decoration: none;
                display: inline-block;
                font-size: 16px;
                margin: 4px 2px;
                /*transition-duration: 0.4s;*/
                cursor: pointer;
            }

            table {
                margin-left: auto;
                margin-right: auto;
            }
            td {
                width: 8rem;
                height: 4rem;
                border: 1px solid #ccc;
                text-align: center;
            }
            th {
                background: lightblue;
                border-color: white;
            }

            body {
                padding: 1rem;
            }

        </style>

    </head>

    <body>


    <div class="container">

        <form action="/mp" enctype="multipart/form-data" method="post">
            @csrf

            <div class="row">
                <div class="col-8 offset-2">

                    <div class="row pb-3">
                        <h1>Add Meal Plan</h1>
                    </div>

                    <div class="row">

                        <table class="table" >

                            <tr>
                                <td><button class="button-1 button">MON</button></td>
                                <td><button class="button-2 button">TUE</button></td>
                                <td><button class="button-3 button">WED</button></td>
                            </tr>

                            <tr>
                                <td><button class="button-4 button">THURS</button></td>
                                <td><button class="button-5 button">FRI</button></td>
                                <td><button class="button-6 button">SAT</button></td>
                            </tr>
                            <tr>
                                <td></td>
                                <td><button class="button-7 button">SUN</button></td>
                                <td></td>
                            </tr>
                        </table>

                    </div>

                    <header>Enter Meals</header>

                    <div class="form-outer">

                        <form action="/mp" enctype="multipart/form-data" method="post">
                            @csrf

                                <div class="field">

                                    <label for="caption" class="col-md-4 col-form-label">Day</label>

                                    <select>

                                        <option> --Select Tags--</option>

                                        <option id="monday"
                                                class="form-control"
                                                name="monday">
                                            Monday</option>

                                        <option id="tuesday"
                                                class="form-control"
                                                name="tuesday">
                                            Tuesday</option>

                                        <option  id="wednesday"
                                                 class="form-control"
                                                 name="wednesday">
                                            Wednesday</option>

                                        <option  id="thursday"
                                                 class="form-control"
                                                 name="thursday">
                                            Thursday</option>

                                        <option  id="friday"
                                                 class="form-control"
                                                 name="friday">
                                            Friday</option>

                                        <option  id="saturday"
                                                 class="form-control"
                                                 name="saturday"
                                        >Saturday</option>

                                        <option  id="sunday"
                                                 class="form-control"
                                                 name="sunday"
                                        >Sunday</option>

                                    </select>

                                    @if ($errors->has('day_id'))
                                        <span class="invalid-feedback" role="alert">
                            <strong>{{ $errors->first('day_id') }}</strong>
                        </span>
                                    @endif

                                </div>

                                <div class="field">

                                    <label for="caption" class="col-md-4 col-form-label">Breakfast</label>

                                    <input id="breakfast"
                                           type="text"
                                           class="form-control{{ $errors->has('breakfast') ? ' is-invalid' : '' }}"
                                           name="breakfast"
                                           value="{{ old('breakfast') }}"
                                           autocomplete="name" autofocus>

                                    @if ($errors->has('breakfast'))
                                        <span class="invalid-feedback" role="alert">
                                            <strong>{{ $errors->first('breakfast') }}</strong>
                                        </span>
                                    @endif

                                </div>

                                <div class="field">

                            <label for="caption" class="col-md-4 col-form-label">Lunch</label>

                            <input id="lunch"
                                   type="text"
                                   class="form-control{{ $errors->has('lunch') ? ' is-invalid' : '' }}"
                                   name="lunch"
                                   value="{{ old('lunch') }}"
                                   autocomplete="name" autofocus>

                            @if ($errors->has('lunch'))
                                <span class="invalid-feedback" role="alert">
                            <strong>{{ $errors->first('lunch') }}</strong>
                        </span>
                            @endif

                                </div>

{{--                                <div class="field">--}}

{{--                            <label for="caption" class="col-md-4 col-form-label">Snack</label>--}}

{{--                            <input id="snack"--}}
{{--                                   type="text"--}}
{{--                                   class="form-control{{ $errors->has('snack') ? ' is-invalid' : '' }}"--}}
{{--                                   name="snack[]"--}}
{{--                                   value="snack3{{ old('snack') }}"--}}
{{--                                   autocomplete="name" autofocus>--}}

{{--                            @if ($errors->has('snack'))--}}
{{--                                <span class="invalid-feedback" role="alert">--}}
{{--                            <strong>{{ $errors->first('snack') }}</strong>--}}
{{--                        </span>--}}
{{--                            @endif--}}

{{--                        </div>--}}

                                <div class="field">

                            <label for="caption" class="col-md-4 col-form-label">Dinner</label>

                            <input id="dinner"
                                   type="text"
                                   class="form-control{{ $errors->has('meal') ? ' is-invalid' : '' }}"
                                   name="dinner"
                                   value="{{ old('dinner') }}"
                                   autocomplete="name" autofocus>

                            @if ($errors->has('dinner'))
                                <span class="invalid-feedback" role="alert">
                            <strong>{{ $errors->first('dinner') }}</strong>
                        </span>
                            @endif

                                </div>

                            <div class="field">

                                <label for="caption" class="col-md-4 col-form-label">Snack</label>

                                <input id="snack"
                                       type="text"
                                       class="form-control{{ $errors->has('snack') ? ' is-invalid' : '' }}"
                                       name="snack"
                                       value="{{ old('snack') }}"
                                       autocomplete="name" autofocus>

                                @if ($errors->has('snack'))
                                    <span class="invalid-feedback" role="alert">
                            <strong>{{ $errors->first('snack') }}</strong>
                        </span>
                                @endif

                            </div>

{{--                                <div class="field">--}}

{{--                                    <label for="caption" class="col-md-4 col-form-label">Snack</label>--}}

{{--                                    <input id="snack"--}}
{{--                                           type="text"--}}
{{--                                           class="form-control{{ $errors->has('snack') ? ' is-invalid' : '' }}"--}}
{{--                                           name="snack[]"--}}
{{--                                           value="snack4{{ old('snack') }}"--}}
{{--                                           autocomplete="name" autofocus>--}}

{{--                            @if ($errors->has('snack'))--}}
{{--                                <span class="invalid-feedback" role="alert">--}}
{{--                            <strong>{{ $errors->first('snack') }}</strong>--}}
{{--                        </span>--}}
{{--                            @endif--}}

{{--                                </div>--}}

                                <div class="row pt-4">
                                    <button class="btn btn-primary">Add New Post</button>
                                </div>

                        </form>

                    </div>

                    </div>

                </div>
        </form>
    </div>

    </body>

@endsection

选择日期下拉菜单将被更正。

MealPlanController.php

<?php

namespace App\Http\Controllers;

use App\MealPlan;
use Illuminate\Http\Request;

class MealPlanController extends Controller
{

    public function __construct()
    {
        $this->middleware('auth', ['except' => ['show']]);
    }
    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Contracts\Foundation\Application|\Illuminate\Contracts\View\Factory|\Illuminate\Contracts\View\View|\Illuminate\Http\Response
     */
    public function index()
    {
        $users = auth()->user()->following()->pluck('profiles.user_id');

        $plans = MealPlan::whereIn('user_id', $users)->with('user')->latest()->paginate(5);

        return view('meal.create.index', compact($plans));
    }

    /**
     * Show the form for creating a new resource.
     *
     * @return \Illuminate\Contracts\Foundation\Application|\Illuminate\Contracts\View\Factory|\Illuminate\Contracts\View\View|\Illuminate\Http\Response
     */
    public function create()
    {
        return view('meal.create');
    }

    /**
     * Store a newly created resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Contracts\Foundation\Application|\Illuminate\Http\RedirectResponse|\Illuminate\Http\Response|\Illuminate\Routing\Redirector
     */
    public function store()
    {
        $data = request()->validate([
            'day_id' => 'required',
            'breakfast' => 'required',
            'lunch' => 'required',
            'dinner' => 'required',
            'snack' => 'required',
        ]);

        auth()->user()->plans()->create([
            'day_id' => $data['day_id'],
            'breakfast' => $data['breakfast'],
            'lunch' => $data['lunch'],
            'dinner' => $data['dinner'],
            'snack' => $data['snack'],

        ]);

        return redirect('/profile/' . auth()->user()->id);
    }


    /**
     * Display the specified resource.
     *
     * @param  \App\MealPlan  $mealPlan
     * @return \Illuminate\Http\Response
     */
    public function show(MealPlan $mealPlan)
    {
        //
    }

    /**
     * Show the form for editing the specified resource.
     *
     * @param  \App\MealPlan  $mealPlan
     * @return \Illuminate\Http\Response
     */
    public function edit(MealPlan $mealPlan)
    {
        //
    }

    /**
     * Update the specified resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \App\MealPlan  $mealPlan
     * @return \Illuminate\Http\Response
     */
    public function update(Request $request, MealPlan $mealPlan)
    {
        //
    }

    /**
     * Remove the specified resource from storage.
     *
     * @param  \App\MealPlan  $mealPlan
     * @return \Illuminate\Http\Response
     */
    public function destroy(MealPlan $mealPlan)
    {
        //
    }
}

无论何时尝试发布它,它都会刷新页面。请任何我能得到的建议将不胜感激。如果我能得到进一步的建议,我什至可以传递我的电子邮件,否则在这里很难解释。

谢谢。

【问题讨论】:

    标签: php database laravel controller store


    【解决方案1】:

    您还有很多需要改进的地方。

    像这样改变你的日程表

    Schema::create('days', function (Blueprint $table) {
       $table->id();
       $table->string('day');
       $table->timestamps();
    });
    

    那你应该像这样写一个播种机

    public function run()
    {
        $days = [
            ['id' => 1, 'day'  => 'Monday'],
            ['id' => 2, 'day'  => 'Tuesday'],
            ['id' => 3, 'day'  => 'Wednesday'],
            ['id' => 4, 'day'  => 'Thursday'],
            ['id' => 5, 'day'  => 'Friday'],
            ['id' => 6, 'day'  => 'Saturday'],
            ['id' => 7, 'day'  => 'Sunday'],
        ];
    
        foreach ($days as $key => $day) {
            DB::table('days')->insert($day);
        }
    }
    

    那么就很容易在下拉列表中获取日期了。

    您应该为选择框添加一个名称属性。现在您有了选项的名称属性。错了。

    Snack 是数组还是字符串?你有两个。因为您像文本一样存储它。它不应该是一个数组。

    终于要换店了

    public function store(Request $request)
    {
        $data = $request()->validate([
            'day_id' => 'required',//Should come from the days table
            'breakfast' => 'required',
            'lunch' => 'required',
            'dinner' => 'required',
            'snack' => 'required',
        ]);
    
        auth()->user()->plans()->create([
            'day_id' => $request->get('day_id'),
            'breakfast' => $request->get('breakfast'),
            'lunch' => $request->get('lunch'),
            'dinner' => $request->get('dinner'),
            'snack' => $request->get('snack')
        ]);
    
        return redirect('/profile/' . auth()->user()->id);
    }
    

    试试这个并告诉我。

    【讨论】:

    • 我最初想在条目中添加三种不同的零食,所以早餐后、午餐后和晚餐后各一种。但是,我认为作为第一次迭代,我应该保持简单。所以,我添加了你提到的播种机,但是填充下拉菜单有点烦人。我在视图中使用了以下代码 --- @foreach($days as $day) @endforeach
    • 我也用过 dd(\request()->all());并返回数组:6 [▼ "_token" => "1ZpvmJvtIDYyF9CpHs3Q1AX4YqpZFXVzxbPB5w6h" "days_id" => "Monday" "breakfast" => "jhbjbub" "lunch" => "bjh" "dinner" => "bjb" "snack " => "jb" ] 所以,我对它一直失败的地方感到困惑
    • 你会得到 day_id 的当天 id
    • 检查 laravel 日志中的错误信息。它将引导您找到错误。
    • 我不确定,但似乎有些东西坏了,它一直说未定义的变量 $days,只是为了确保我在公共函数 create() 中定义了它,但问题不断重复本身。
    猜你喜欢
    • 1970-01-01
    • 2017-01-10
    • 1970-01-01
    • 2021-10-26
    • 1970-01-01
    • 1970-01-01
    • 2021-11-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多