试图在我的 Laravel 项目中获取 属性 'nama_member' 的非对象

Trying to get property 'nama_member' of non-object in my Laravel project

我的 Blade 视图有问题,我的代码有什么问题,我在控制器中编写代码或在我声明的代码模型中写错了吗? 错误说

Trying to get property 'nama_member' of non-object (View: C:\xampp\htdocs\rezkastore\resources\views\pages\daftar_pelanggan.blade.php)

Blade/View

@extends('layouts.app')
@section('title', 'Daftar Pelanggan')
@section('content')
<div class="header bg-primary pb-6">
      <div class="container-fluid">
        <div class="header-body"> </div>
      </div>
</div>

<div class="container-fluid mt--6">
      <!-- Table -->
      <div class="row">
        <div class="col">
          <div class="card">
            <!-- Card header -->
          <div class="card-header">
            <div class="row align-items-center py-0">
              <div class="col-lg-6 col-7">
                <h6 class="h2 d-inline-block mb-0">Data Pelanggan</h6>
              </div>
              <div class="col-lg-6 col-5 text-right">
                <button class="btn btn-icon btn-primary" type="button" data-toggle="modal" data-target="#addModal">
                  <span class="btn-inner--icon"><i class="fa fa-plus-circle" aria-hidden="true"></i></span>
                  <span class="btn-inner--text">Tambah Data</span>
                </button>
              </div>
            </div>
          </div>
            <div class="table-responsive py-4">
              <table class="table table-flush" id="datatable-basic">
                <thead class="thead-light">
                  <tr>
                    <th width="30px">No</th>
                    <th>Nama Produk</th>
                    <th>Alamat</th>
                    <th>No.Telp</th>
                    <th>Member</th>
                    <th>Menu</th>
                  </tr>
                </thead>
                <tfoot>
                  <tr>
                    <th width="20px">No</th>
                    <th>Nama</th>
                    <th>Alamat</th>
                    <th>No.Telp</th>
                    <th>Member</th>
                    <th>Menu</th>
                  </tr>
                </tfoot>
                <tbody>
                  @php
                    $no = 1;
                  @endphp
                  @foreach($daftar_pelanggan as $pelanggan)
                  <tr>
                    <td>{{$no++ }}</td>
                    <td>{{ $pelanggan->nama_pelanggan }}</td>
                    <td>{{ $pelanggan->alamat }}</td>
                    <td>{{ $pelanggan->no_telp }}</td>
                    <td> {{ $pelanggan->diskon->nama_member }}</td>
                    <td>
                    <button data-toggle="modal" data-target="#editModal-{{ $pelanggan->id }}" class="btn btn-sm btn-primary"><i class="fa fa-edit"></i></button>
                      <button class="btn btn-sm btn-danger" type="button" onclick="deletepelanggan({{ $pelanggan->id }})"> <i class="fa fa-trash"></i>
                        </button>
                        <form id="delete-form-{{ $pelanggan->id }}" action="{{ route('daftar_pelanggan.delete',$pelanggan->id) }}" method="POST" style="display: none;">
                          @csrf
                          @method('DELETE')
                        </form>
                    </td>
                  </tr>
                  @endforeach
                </tbody>
              </table>
          </div>      
        </div>
      </div>
    </div>
    </div>

      <!-- Modal  Add -->
     <div class="modal fade" id="addModal" tabindex="-1" role="dialog" aria-labelledby="addModalLabel" aria-hidden="true">
       <div class="modal-dialog modal-dialog-centered" role="document">
          <div class="modal-content">
                <div class="modal-header">
                  <h5 class="modal-title mb-0" id="addModalLabel">Tambah Data Pelanggan</h5>
                </div>
              <div class="modal-body">
                 <!-- Card body -->
                <form role="form" action="{{ route('daftar_pelanggan.create') }}" method="POST">
                  @csrf
                  @method('POST')
                    <!-- Input groups with icon -->
                  <div class="form-group row">
                      <label for="addNamaPelanggan" class="col-md-4 col-form-label form-control-label">Nama <span class="text-danger">*</span></label>
                      <div class="col-md-8">
                        <input class="form-control" type="nama" placeholder="Nama Lengkap" id="addNamaPelanggan" name="addNamaPelanggan" required oninvalid="this.setCustomValidity('data tidak boleh kosong')" oninput="setCustomValidity('')">
                      </div>
                    </div>
                    <div class="form-group row">
                      <label for="addAlamat" class="col-md-4 col-form-label form-control-label">Alamat <span class="text-danger">*</span></label>
                      <div class="col-md-8">
                        <input class="form-control" type="alamat" placeholder="Jatibarang" id="addAlamat" name="addAlamat" required oninvalid="this.setCustomValidity('data tidak boleh kosong')" oninput="setCustomValidity('')">
                      </div>
                    </div>
                    <div class="form-group row">
                      <label for="addNoTelp" class="col-md-4 col-form-label form-control-label">No.Telp <span class="text-danger">*</span></label>
                      <div class="col-md-8">
                        <input class="form-control" type="notelp" placeholder="083XXXXXXXXX" id="addNoTelp" name="addNoTelp" required oninvalid="this.setCustomValidity('data tidak boleh kosong')" oninput="setCustomValidity('')">
                      </div>
                    </div>
                    <div class="form-group row">
                      <label for="addNoTelp" class="col-md-4 col-form-label form-control-label">diskon Member <span class="text-danger">*</span></label>
                      <div class="col-md-8">
                      <select class="form-control" name="AddDiskonid" required oninvalid="this.setCustomValidity('data tidak boleh kosong')" oninput="setCustomValidity('')"">
                          <option disabled selected>-- Pilih Member --</option>
                          @foreach($diskons as $diskon)
                              <option value="{{ $diskon->id }}">{{ $diskon->nama_member }}</option>
                          @endforeach
                          </select>
                      </div>
                    </div>
                    
            </div>
            <div class="modal-footer">
              <button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button>
              <button type="submit" class="btn btn-primary">Tambah Data</button>
            </div>
            </form>
         </div>
       </div>
    </div>

     <!-- Modal  edit -->
     @foreach($daftar_pelanggan as $pelanggan)
     <div class="modal fade" id="editModal-{{ $pelanggan->id }}" tabindex="-1" role="dialog" aria-labelledby="editModalLabel" aria-hidden="true">
       <div class="modal-dialog modal-dialog-centered" role="document">
          <div class="modal-content">
                <div class="modal-header">
                  <h5 class="modal-title mb-0" id="editModalLabel">Update Data Pelanggan</h5>
                </div>
              <div class="modal-body">
                 <!-- Card body -->
                <form role="form" action="{{ route('daftar_pelanggan.update', $pelanggan->id) }}" method="POST" id="editForm">
                  @csrf
                  @method('PUT')
                    <!-- Input groups with icon -->
                  <div class="form-group row">
                      <label for="updateNamaPelanggan" class="col-md-4 col-form-label form-control-label">Nama <span class="text-danger">*</span></label>
                      <div class="col-md-8">
                      <input type="hidden" name="id"  value="{{ $pelanggan->id }}">
                        <input class="form-control" type="nama"  value="{{ $pelanggan->nama_pelanggan }}" name="updateNamaPelanggan" required >
                      </div>
                    </div>
                    <div class="form-group row">
                      <label for="updateAlamat" class="col-md-4 col-form-label form-control-label">Alamat <span class="text-danger">*</span></label>
                      <div class="col-md-8">
                        <input class="form-control" type="alamat" value="{{ $pelanggan->alamat }}"  name="updateAlamat" required>
                      </div>
                    </div>
                    <div class="form-group row">
                      <label for="updateNoTelp" class="col-md-4 col-form-label form-control-label">No.Telp <span class="text-danger">*</span></label>
                      <div class="col-md-8">
                        <input class="form-control" type="notelp" value="{{ $pelanggan->no_telp }}"  name="updateNoTelp" required>
                      </div>
                    </div>
                    <div class="form-group row">
                      <label for="addNoTelp" class="col-md-4 col-form-label form-control-label">Diskon Member <span class="text-danger">*</span></label>
                      <div class="col-md-8">
                      <select class="form-control" name="diskon_id" required oninvalid="this.setCustomValidity('data tidak boleh kosong')" oninput="setCustomValidity('')">
                      <option disabled selected>-- Kategori Member --</option>
                          @foreach($diskons as $diskon)
                            <option 
                            @if($produk->diskon_id ==  $diskon->id)
                              selected="selected" 
                            @endif
                            value="{{ $diskon->id }}">{{ $diskon->nama_member }}</option>
                          @endforeach
                      </div>
                    </div>
            </div>
            <div class="modal-footer">
            <button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button>
              <button type="submit" class="btn btn-primary">Update Data</button>
            </div>
            </form>
         </div>
       </div>
    </div>
    @endforeach

    @include('layouts.footers.auth')  
    @section('scripts') 
    <script type="text/javascript">
    function deletepelanggan(id) {
        swal({
            title: 'Yakin Ingin Hapus Data ini?',
            text: "Data Tidak Bisa Dikembalikan Setelah Dihapus!",
            type: 'warning',
            showCancelButton: true,
            confirmButtonColor: '#3085d6',
            cancelButtonColor: '#d33',
            confirmButtonText: 'Ya, Hapus!',
            cancelButtonText: 'Tidak',
            confirmButtonClass: 'btn btn-success',
            cancelButtonClass: 'btn btn-danger',
            buttonsStyling: false,
            reverseButtons: true
        }).then((result) => {
            if (result.value) {
                event.preventDefault();
                document.getElementById('delete-form-'+id).submit();
                swal(
                  'Deleted!',
                  'Your file has been deleted.',
                  'success')
            } else (
                result.dismiss === swal.DismissReason.cancel
            ) 
        })
      } 
    </script>
    @endsection  
@endsection

控制器

class DaftarPelangganController extends Controller
{
    public function index()
    {
        $daftar_pelanggan = DaftarPelanggan::all();
        $diskons = Diskon::all();
        return view('pages.daftar_pelanggan', compact('daftar_pelanggan', 'diskons'));
    }

    public function update(Request $request, $id)
    {
        $update_pelanggan = DaftarPelanggan::findOrFail($id);
        $update_pelanggan->nama_pelanggan = $request->updateNamaPelanggan;
        $update_pelanggan->alamat = $request->updateAlamat;
        $update_pelanggan->no_telp = $request->updateNoTelp;
        $update_pelanggan->diskon_id = $request->diskon_id;
        $update_pelanggan->save();
        
        if ($update_pelanggan) {
            Alert::success(' Berhasil Update Data ', ' Silahkan dicek kembali');
        } elseif (!$update_pelanggan) {
            Alert::error('Data Sudah Ada', ' Silahkan coba lagi');
        }
        
        return redirect()->back();
    }

    public function create(Request $request)
    {
        $simpan = DB::table('daftar_pelanggans')->insert([
            'nama_pelanggan' => $request->post('addNamaPelanggan'),
            'alamat' => $request->post('addAlamat'),
            'no_telp' => $request->post('addNoTelp'),
            'diskon_id' => $request->post('addDiskonid'),
        ]);

        if ($simpan) {
            Alert::success(' Berhasil Tambah data ', ' Silahkan dicek kembali');
        } else {
            Alert::error('data gagal disimpan ', ' Silahkan coba lagi');
        }
        
        return redirect()->back();
    }

    public function delete($id)
    {
        DB::table('daftar_pelanggans')->where('id', $id)->delete();
        
        return redirect()->back();
    }
}

型号

class DaftarPelanggan extends Model
{
    use HasFactory;

    protected $table = "daftar_pelanggans";
    protected $primaryKey = 'id';
    protected $fillable = [
        'nama_pelanggan',
        'alamat',
        'no_telp',
        'poin',
        'diskon_id',
    ];

    public function diskon()
    {
        return $this->belongsTo(Diskon::class, 'diskon_id');
    }
}

Eager load the diskon relation,这也有助于防止N+1问题。

public function index()
{
    $daftar_pelanggan = DaftarPelanggan::with('diskon')->get();
    $diskons = Diskon::all();

    //Since $diskons is required for selects where in only id and nama_member is required
    //You can select the two columns only to save on memory
    $diskons = Diskon::select('id', 'nama_member')->get();

    return view('pages.daftar_pelanggan',compact('daftar_pelanggan','diskons'));
}

为了避免在 relation/related 模型不存在时出现错误,当在 blade 中循环显示相关模型时,我们可以使用默认值

定义关系
   
   public function diskon(){
    return $this->belongsTo(Diskon::class,'diskon_id')->withDefault([
        'nama_member' => 'Guest',
    ]);
   }