#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!');
}
}