Не удается обновить базу данных Laravel (модель, представление, контроллер)

#laravel #eloquent

#laravel #красноречивый

Вопрос:

В настоящее время я работаю с Laravel. Я новичок и все еще пытаюсь привыкнуть к платформе. Я хочу обновить свою базу данных на основе ввода формы, но это не работает. Я пробовал обновлять модели, представления и контроллеры и, похоже, не могу обновить базу данных с помощью входных значений.

Мой взгляд:

 <div class="form-group row">
<label class="col-xs-2 col-form-label">Expiration Date</label>
<div class="col-xs-10">
<input class="form-control" type="date" value="{{ $Document->expires_at }}" name="expires_at" placeholder="Expiration Date">
</div>
</div></form>

            <embed src="{{ asset('storage/'.$Document->url) }}" width="100%" height="100%" />

            <div class="row">
                <div class="col-xs-6">
                    <form action="{{ route('admin.provider.document.update', [$Document->provider->id, $Document->id]) }}" method="POST">
                        {{ csrf_field() }}
                        {{ method_field('PUT') }}
                        <button class="btn btn-block btn-primary" type="submit">Approve</button>
                    </form>
                </div></form>
  

Моя модель:

 <?php

namespace App;

use IlluminateDatabaseEloquentModel;

class ProviderDocument extends Model
{
    protected $table = 'provider_documents';

    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $fillable = [
        'provider_id',
        'document_id',
        'url',
        'unique_id',
        'status',
        'expires_at',

    ];

    /**
     * The attributes that should be hidden for arrays.
     *
     * @var array
     */
    protected $hidden = [

    ];

    /**
     * The services that belong to the user.
     */
    public function provider()
    {
        return $this->belongsTo('AppProvider');
    }
    /**
     * The services that belong to the user.
     */
    public function document()
    {
        return $this->belongsTo('AppDocument');
    }
}
  

Мой контроллер:

 public function update(Request $request, $provider, $id)
    {
        if(Setting::get('demo_mode', 0) == 1) {
            return back()->with('flash_error', 'Disabled for demo purposes! Please contact us at info@appoets.com');
        }

        try {

            $Document = ProviderDocument::where('provider_id', $provider)
                ->where('id', $id)
                ->firstOrFail();
            $Document->update(['status' => 'ACTIVE']);
            $Document->expires_at = $request['expires_at'];
            $Document->save();
            return redirect()->route('admin.provider.document.index', $provider)->with('flash_success', 'Provider document has been approved.');

        }
        catch (ModelNotFoundException $e) {
            return redirect()->route('admin.provider.document.index', $provider)->with('flash_error', 'Provider not found!');
        }
    }
  

База данных остается пустой без ошибок. Если я вручную помещу ее в базу данных напрямую, затем перейду к форме и обновлю, она будет удалена. Пожалуйста, помогите.

Комментарии:

1. dd() ваша переменная в контроллере и сначала посмотрите, сохранено ли значение внутри. Возможно, вы сохраняете нулевой ввод.

2. .. Ваше представление является беспорядочным, и я думаю, что причиной ошибки является то, что ваш ввод был за пределами формы, и у вас есть несколько тегов формы в ваших представлениях.

3. @LimKeanPhang прав — ваша форма не отправляет ожидаемые данные, потому что expires_at поле находится за пределами формы. Таким образом, ваш update() метод не получает ее и просто обновляет запись вашей базы данных теми же данными, поэтому ничего не меняется.

4. Спасибо всем за ваш вклад. @LimKeanPhang хотя мне не понравился ваш выбор слов для моего представления, вы были правы. Я очистил форму. Я опубликую результат ниже. Фух! У вас, ребята, действительно большой талант и глазомер!

5. Его фреймворк laravel, поэтому структура кода должна быть приятной, в этом прелесть самого фреймворка 😅. Рад, что это помогает! Приветствия!

Ответ №1:

Благодаря вкладу @@LimKeanPhang выше, ниже приведен конечный результат. Мне не пришлось менять модель или контроллер. Просто представление. Сработало как шарм.

 <form class="form-horizontal" action="{{ route('admin.provider.document.update', [$Document->provider->id, $Document->id]) }}" method="POST">{{csrf_field()}}
<input type="hidden" name="_method" value="PATCH">
    <div class="form-group row">
        <label class="col-xs-2 col-form-label">Expiration Date</label>
            <div class="col-xs-10">
                <input class="form-control" type="date" value="{{ $Document->expires_at }}" name="expires_at" placeholder="Expiration Date">
            </div>
    </div>

            <embed src="{{ asset('storage/'.$Document->url) }}" width="100%" height="100%" />

            <div class="row">
                <div class="col-xs-6">
                        <button class="btn btn-block btn-primary" type="submit">Approve</button>

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

Ответ №2:

Почему бы вам не получить документ только по идентификатору следующим образом? Пожалуйста, попробуйте следующий код. Это должно сработать.

Функция обновления контроллера.

 public function update(Request $request, $provider, $id)
{
    if (Setting::get('demo_mode', 0) == 1) {
        return back()->with('flash_error', 'Disabled for demo purposes! Please contact us at info@appoets.com');
    }

    try {

        $Document = ProviderDocument::find($id);
        $Document->status = 'ACTIVE';
        $Document->expires_at = $request['expires_at'];
        $Document->save();

        return redirect()->route('admin.provider.document.index', $provider)->with('flash_success',
            'Provider document has been approved.');

    } catch (ModelNotFoundException $e) {
        return redirect()->route('admin.provider.document.index', $provider)->with('flash_error',
            'Provider not found!');
    }
}