Почему выдает ошибку Attempt to read property "title" on null?
Почему мне выдает ошибку Attempt to read property "title" on null? Делаю список избранного. В бд товары добавляются, но я не могу их вывести на странице
public function index(){
$user = Auth::user();
$wishlist = Wish::where('user_id', $user->id)->orderby('id', 'desc')->get();
return view('wish', compact('wishlist'));
}
class Product extends Model
{
use HasFactory;
public function wishlist(){
return $this->hasMany(Wish::class);
}
}
public function wishlist(){
return $this->hasMany(Wish::class);
}
class Wish extends Model
{
use HasFactory;
protected $guarded = [];
public function products(){
return $this->belongsTo(Product::class);
}
public function user(){
return $this->belongsTo(User::class);
}
}
@foreach ($wishlist as $item)
{{$item->products->title}}
@endforeach
Ответы (1 шт):
Потому что Вы пытаетесь получить свойство products, а у какого-то из предметов в списке нет связи или вообще этого свойства не существует в ответе.
Для избежания ошибки нужно использовать optional chaining или проверять условием.
@foreach ($wishlist as $item)
{{$item->products?->title}}
@endforeach
или
@foreach ($wishlist as $item)
@if(!isset($item->products))
{{$item->products->title}}
@endif
@endforeach
Дальше не к основному вопросу.
Ошибка возникла (скорее всего, т.к Вы вероятнее всего указали везде предметы в базе) из-за того, что Вы не указываете связь в запросе. Само по себе связь вроде бы не подтягивает. Поэтому в index следующее должно быть:
$wishlist = Wish::where('user_id', $user->id)->with('products')->orderby('id', 'desc')->get();
И ещё смотрите внимательно, как обрабатываете данные в шаблоне. Вероятно, Вы ожидаете получить в $item->products массив, а не объект, поэтому в шаблоне должен быть второй цикл.