Попытка получить свойство nama_member не-объекта в моем проекте Laravel

У меня проблемы с моим взглядом на Блейд, что не так с моим кодом, я неправильно написал код в контроллере или в моей модели кода я объявил? ошибка сказала

Попытка получить свойство nama_member не-объекта (Вид: C:\xampp\htdocs\rezkastore\resources\views\pages\daftar_pelanggan.blade.php)

Лезвие/Вид

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

убедитесь, что все ваши $daftar_pelanggan имеют дисконы, эта ошибка говорит о том, что один из ваших $daftar_pelanggan не назначен ни на один дискон, и все же вы хотите получить его "nama_member"

milad hedayatpoor 13.12.2020 07:30

Можете ли вы обновить вопрос с моделью Discon и файлами миграции?

tf. 13.12.2020 10:06
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
2
1 958
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Стремитесь загрузить отношение diskon, это также поможет предотвратить проблему 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'));
}

Чтобы избежать ошибки, когда отношение/связанная модель не существует, при отображении связанной модели в цикле в лезвии мы можем определить отношение по умолчанию.

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

все еще не работает, я ошибаюсь в своем лезвии?

Marc Jamal 13.12.2020 07:59

@MarcJamal Обновлен ответ, чтобы определить отношения дисконов в модели DaftarPelanggan по умолчанию. Проверьте и дайте мне знать, что это работает для вас

Donkarnash 13.12.2020 08:09

@MarcJamal Не должен @if ($produk->diskon_id == $diskon->id) быть @if ($pelanggan->diskon_id == $diskon->id) в разделе выбора модального редактирования - $produk не отображается нигде в представлении и не передается через контроллер

Donkarnash 13.12.2020 08:14

это работает, но как просмотреть члена статуса, не использующего функцию по умолчанию в качестве гостя?

Marc Jamal 13.12.2020 11:35

Значение по умолчанию вступает в силу только в том случае, если для родительской записи нет связанной записи на диске. Таким образом, одна из ваших родительских записей (DaftarPelanggan) не имеет связанной записи Diskon, поэтому в игру вступает значение по умолчанию. Если значение по умолчанию не указано, вы получите сообщение об ошибке при попытке получить свойство не-объекта, так как в этом случае $daftar_pelanggan->diskon будет иметь значение null, поэтому $daftar_pelanggan->diskon->nama_member будет похоже на доступ к свойству nama_member с нулевым значением

Donkarnash 13.12.2020 11:40

@MarcJamal Надеюсь, мой предыдущий комментарий прояснил для вас ситуацию, дайте мне знать, если это не так. Вы можете прочитать больше на laravel.com/docs/8.x/eloquent-relationships#default-models

Donkarnash 13.12.2020 12:05

да, это работает, спасибо, но когда я создал новую запись в datatables, поле Discount_id всегда равно нулю, возможно, у меня неправильный код в опции выбора при добавлении модального

Marc Jamal 13.12.2020 15:51

Вы можете проверить, как создаются параметры выбора с какими значениями в devtools, а также вы можете dd($request->input('AddDiskonid')) в методе хранения контроллера, чтобы проверить значение, которое вы получаете. Также проверьте, находится ли diskon_id в массиве $fillable или при использовании $guarded его нет в массиве $guarded, т.е. он не защищен для массового назначения.

Donkarnash 13.12.2020 16:12

Другие вопросы по теме