Невозможно обновить данные с помощью Laravel не показывает никаких ошибок - PullRequest
0 голосов
/ 09 июля 2020

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

Путь для редактирования и обновления

Route::get('contact/{contact}/edit', 'ContactController@edit');
Route::post('contact/update','ContactController@update');

Контроллер с функцией редактирования и обновления

use Illuminate\Http\Request;
use App\Contact;
use DB;

public function edit($kode_kontak){
        $contact = DB::table('contact')->where('kode_kontak',$kode_kontak)->get();
        return view('contact.edit',['contact' => $contact]);
    }

public function update(Request $request){
        DB::table('contact')->where('kode_kontak',$request->kode_kontak)->update([
            'email' => $request->email,
            'telepon' => $request->telepon,
        ]);
        return redirect('contact');
    }

Модель

class Contact extends Model
{
    public $timestamps = false;
    
    protected $table = 'contact';

    protected $fillable = [
        'kode_kontak',
        'kode_pegawai',
        'email',
        'telepon'
        
    ];

    protected $primaryKey = 'kode_kontak';
}

Вид edit.blade. php

<div id="contact">
    <h2>Edit Contact</h2>
    @foreach($contact as $p)
        <form action="/contact/update" method="POST">
        @csrf
        <div class="form-group">
            <label for="kode_contact" class="control-label">Kode Kontak</label>
            <input type="text" name="kode_kontak" id="kode_kontak" class="form-control" value="{{ $p->kode_kontak}}" disabled>
        </div>
        <div class="form-group">
            <label for="kode_pegawai" class="control-label">Kode Pegawai</label>
            <input type="text" name="kode_pegawai" id="kode_pegawai" class="form-control" value="{{ $p->kode_pegawai}}" disabled>
        </div>
        <div class="form-group">
            <label for="email" class="control-label">Email</label>
            <input type="text" name="email" id="email" class="form-control" value="{{ $p->email}}">
        </div>
        <div class="form-group">
            <label for="telepon" class="control-label">Telepon</label>
            <input type="text" name="telepon" id="telepon" class="form-control" value="{{ $p->telepon}}">
        </div>
        <div class="form-group">
            <input class="btn btn-primary form-control" type="submit" value="Simpan">
        </div>
    </form>
    @endforeach
</div>

Ответы [ 2 ]

1 голос
/ 09 июля 2020

В вашем маршруте обновления используется неправильный «глагол» и URL. Если вы посмотрите на Laravel * Контроллеры ресурсов , вы увидите различные действия и имена маршрутов, доступные для редактирования, обновления, удаления et c. при создании контроллера «CRUD».

Вы можете увидеть маршрут для действия «update» и его «глагол».

Измените свои маршруты на

Route::get('contact/{contact}/edit', 'ContactController@edit')->name('contact.edit');
Route::patch('contact/{contact}','ContactController@update')->name('contact.update');

Или, если вы хотите добавить полный контроллер CRUD, используйте короткую форму:

Route::resource('contact', 'ContactController');

Это создаст все необходимые маршруты в одной удобной строке кода. Используйте php artisan route:list для проверки всех маршрутов.

Формы HTTP поддерживают только методы GET и POST, Laravel использует @method() в лезвии для добавления других глаголов (положить, исправить, удалить):

Изменить:

ваша форма использует атрибуты disabled на некоторых <input> s. Эти значения будут не отправлены вместе с вашим запросом. Вот обновленные атрибуты edit.blade.php:

  • disabled были заменены на readonly.
  • action использует Laravel s RouteModelBinding
  • Удалено @foreach, поскольку у вас есть только один элемент для редактирования

edit.blade. php:

<div id="contact">
    <h2>Edit Contact</h2>
    <form action="{{ route('contact.update', ['contact' => $contact]) }}" method="POST">
        @csrf
        @method('patch')
        <div class="form-group">
            <label for="kode_contact" class="control-label">Kode Kontak</label>
            <input type="text" name="kode_kontak" id="kode_kontak" class="form-control" value="{{ $contact->kode_kontak}}" readonly>
        </div>
        <div class="form-group">
            <label for="kode_pegawai" class="control-label">Kode Pegawai</label>
            <input type="text" name="kode_pegawai" id="kode_pegawai" class="form-control" value="{{ $contact->kode_pegawai}}" readonly>
        </div>
        <div class="form-group">
            <label for="email" class="control-label">Email</label>
            <input type="text" name="email" id="email" class="form-control" value="{{ $contact->email}}">
        </div>
        <div class="form-group">
            <label for="telepon" class="control-label">Telepon</label>
            <input type="text" name="telepon" id="telepon" class="form-control" value="{{ $contact->telepon}}">
        </div>
        <div class="form-group">
            <input class="btn btn-primary form-control" type="submit" value="Simpan">
        </div>
    </form>
</div>

Так как он использует RouteModelBinding, вы можете изменить свой метод update() на:

public function update(Request $request, Contact $contact)
{
    $contact->update([
        'email' => $request->email,
        'telepon' => $request->telepon,
    ]);
    return redirect('contact');
}

Laravel будет знать, что такое Contact $contact

1 голос
/ 09 июля 2020

вы l oop ваш контакт, чтобы создать форму для каждого из них с тем же именем ввода, id, ... что является неправильным подходом. мое предложение вам: маршрут для редактирования и обновления

Route::get('contact/{contact}/edit', 'ContactController@edit');
Route::post('contact/{contact}/edit', 'ContactController@update');

Контроллер с функцией редактирования и обновления

public function edit(Contact $contact){

  return view('contact.edit',compact('contact'));
}

public function update(Request $request,Contact $contact){

        $contact->update([
            'email' => $request->email,
            'telepon' => $request->telepon,
        ]);

        return redirect('contact');
    }

и, конечно же, вы обновите edit.blade. php

<div id="contact">
    <h2>Edit Contact</h2>
    @foreach($contact as $p)
        <form action="/contact/{{ $p->id }}/update" method="POST">
        @csrf

        <div class="form-group">
            <label for="kode_contact" class="control-label">Kode Kontak</label>
            <input type="text" name="kode_kontak" class="form-control" value="{{ $p->kode_kontak}}" disabled>
        </div>
        <div class="form-group">
            <label for="kode_pegawai" class="control-label">Kode Pegawai</label>
      <input type="text" name="kode_pegawai" class="form-control" value="{{ $p->kode_pegawai}}" disabled>
        </div>
        <div class="form-group">
            <label for="email" class="control-label">Email</label>
            <input type="text" name="email" class="form-control" value="{{ $p->email}}">
        </div>
        <div class="form-group">
            <label for="telepon" class="control-label">Telepon</label>
            <input type="text" name="telepon" class="form-control" value="{{ $p->telepon}}">
        </div>
        <div class="form-group">
            <input class="btn btn-primary form-control" type="submit" value="Simpan">
        </div>
    </form>
    @endforeach
</div>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...