Почему выдает ошибку 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 шт):

Автор решения: Vladimir Gonchar

Потому что Вы пытаетесь получить свойство 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 массив, а не объект, поэтому в шаблоне должен быть второй цикл.

→ Ссылка