【问题标题】:Unable to update data with Laravel does not show any error无法使用 Laravel 更新数据不显示任何错误
【发布时间】:2020-07-09 04:04:14
【问题描述】:

我正在尝试使用 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>

【问题讨论】:

  • 检查存储文件夹中的日志文件。该死的,你肯定会在那里登录,

标签: php laravel


【解决方案1】:

您的更新路线使用了错误的“动词”和网址。如果您查看 Laravel 的 Resource Controllers,您可以看到创建“CRUD”控制器时可用于编辑、更新、删除等的不同操作和路由名称。

您可以看到“更新”操作及其“动词”的路线。

将路线更改为

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 在 Blade 中使用 @method() 来添加其他动词(put、patch、delete):

编辑:

您的表单在某些&lt;input&gt;s 上使用disabled 属性。这些值将不会随您的请求一起发送。这是更新后的edit.blade.php

  • disabled 属性已与 readonly 交换。
  • action 使用 Laravel 的 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 是什么

【讨论】:

  • 这很有帮助,但它仍然不会更新数据..
  • 这是因为,正如我刚刚意识到的那样,您的前两个 &lt;input&gt; 字段具有 disabled 属性。禁用的字段不会随请求一起发送,因此 $request-&gt;kode_kontaknull 并且您的 where 子句不会返回任何内容。如果您不希望用户进行任何更改但仍发送请求中的值,请将您的 disabled 属性更改为 readonly 属性
  • 它也不起作用..我检查了dd($request-&gt;all()) ,但它只显示电子邮件和电话
  • 我更新了我的答案并进行了更多调整,如果有什么不清楚或不起作用,请随时询问
【解决方案2】:

您循环您的联系人,为每个联系人生成一个具有相同输入名称、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>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-10-09
    • 2013-05-28
    • 1970-01-01
    • 2015-04-12
    • 2020-04-12
    • 1970-01-01
    • 2020-01-29
    • 1970-01-01
    相关资源
    最近更新 更多