У меня проблемы с моим взглядом на Блейд, что не так с моим кодом, я неправильно написал код в контроллере или в моей модели кода я объявил? ошибка сказала
Попытка получить свойство 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');
}
}
Можете ли вы обновить вопрос с моделью Discon и файлами миграции?
Стремитесь загрузить отношение 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',
]);
}
все еще не работает, я ошибаюсь в своем лезвии?
@MarcJamal Обновлен ответ, чтобы определить отношения дисконов в модели DaftarPelanggan по умолчанию. Проверьте и дайте мне знать, что это работает для вас
@MarcJamal Не должен @if ($produk->diskon_id == $diskon->id)
быть @if ($pelanggan->diskon_id == $diskon->id)
в разделе выбора модального редактирования - $produk не отображается нигде в представлении и не передается через контроллер
это работает, но как просмотреть члена статуса, не использующего функцию по умолчанию в качестве гостя?
Значение по умолчанию вступает в силу только в том случае, если для родительской записи нет связанной записи на диске. Таким образом, одна из ваших родительских записей (DaftarPelanggan) не имеет связанной записи Diskon, поэтому в игру вступает значение по умолчанию. Если значение по умолчанию не указано, вы получите сообщение об ошибке при попытке получить свойство не-объекта, так как в этом случае $daftar_pelanggan->diskon будет иметь значение null, поэтому $daftar_pelanggan->diskon->nama_member будет похоже на доступ к свойству nama_member с нулевым значением
@MarcJamal Надеюсь, мой предыдущий комментарий прояснил для вас ситуацию, дайте мне знать, если это не так. Вы можете прочитать больше на laravel.com/docs/8.x/eloquent-relationships#default-models
да, это работает, спасибо, но когда я создал новую запись в datatables, поле Discount_id всегда равно нулю, возможно, у меня неправильный код в опции выбора при добавлении модального
Вы можете проверить, как создаются параметры выбора с какими значениями в devtools, а также вы можете dd($request->input('AddDiskonid'))
в методе хранения контроллера, чтобы проверить значение, которое вы получаете. Также проверьте, находится ли diskon_id в массиве $fillable или при использовании $guarded его нет в массиве $guarded, т.е. он не защищен для массового назначения.
убедитесь, что все ваши $daftar_pelanggan имеют дисконы, эта ошибка говорит о том, что один из ваших $daftar_pelanggan не назначен ни на один дискон, и все же вы хотите получить его "nama_member"