я создаю простую систему инвентаризации, используя laravel 9. Я хочу присоединиться к таблицам в Laravel, это таблица категорий, таблица брендов и продукт. Я написал запросы на соединение. но я столкнулся с проблемой с попыткой прочитать свойство «имя» на нуле что я пробовал до сих пор, я прикрепил фрагмент кода ниже.
что я проверил ошибка Ошибка имеет точку вне этой строки {{ $item->категория->имя }}
Модель продукта
protected $table = 'products';
protected $primaryKey = 'id';
protected $fillable = ['barcode_no', 'productname', 'cat_id', 'brand_id', 'price'];
public function category()
{
return $this->belongsTo(Category::class);
}
public function brand()
{
return $this->belongsTo(Brand::class);
}
Модель категории
protected $table = 'categories';
protected $primaryKey = 'id';
protected $fillable = ['name', 'status'];
public function products()
{
return $this->hasMany(Product::class, 'cat_id', 'id');
}
Модель бренда
protected $table = 'brands';
protected $primaryKey = 'id';
protected $fillable = ['name', 'status'];
public function products()
{
return $this->hasMany(Product::class, 'brand_id', 'id');
}
Просмотр продукта
@foreach($products as $item)
<tr>
<td>{{ $loop->iteration }}</td>
<td>{{ $item->barcode_no }}</td>
<td>{{ $item->productname }}</td>
<td>{{ $item->category->name }}</td>
<td>{{ $item->brand->name }}</td>
</tr>
ПродуктКонтроллер
public function index(Request $request)
{
$keyword = $request->get('search');
$perPage = 25;
if (!empty($keyword)) {
$products = Product::where('barcode_no', 'LIKE', "%$keyword%")
->orWhere('productname', 'LIKE', "%$keyword%")
->orWhere('cat_id', 'LIKE', "%$keyword%")
->orWhere('brand_id', 'LIKE', "%$keyword%")
->orWhere('price', 'LIKE', "%$keyword%")
->latest()->paginate($perPage);
} else {
$products = Product::latest()->paginate($perPage);
}
return view('admin.products.index', compact('products'));
}
так как загрузить вместо загрузки catid как имя
$item->category->имя не загружается
Вы пробовали это empty($item->category) ? null : $item->category->name
да Catname не отображается, отображается только название бренда y
@abijega изменить отношение, чтобы вернуть $this->belongsTo(Category::class,'cat_id'); в продукте
спасибо за работу........................................






Проблема с соглашением об именах cat_id в таблице продуктов, поэтому необходимо изменить отношение, как показано ниже, указав идентификатор категории.
public function category()
{
return $this->belongsTo(Category::class,'cat_id');
}
Похоже, что у одного из продуктов может не быть назначенной категории. Поэтому проверьте нулевую проверку в шаблоне блейда, используя помощник option().
<td>{{ optional($item->category)->name }}</td>
<td>{{ optional($item->brand)->name??null }}</td>
и в вашем контроллере вы можете немного оптимизировать код, используя Условные предложения
public function index(Request $request)
{
$keyword = $request->get('search');
$perPage = 25;
$products = Product::with(['category','brand'])->when(!empty($keyword),function ($query)use($keyword){
$query->where('barcode_no', 'LIKE', "%$keyword%")
->orWhere('productname', 'LIKE', "%$keyword%")
->orWhere('cat_id', 'LIKE', "%$keyword%")
->orWhere('brand_id', 'LIKE', "%$keyword%")
->orWhere('price', 'LIKE', "%$keyword%");
})->latest()->paginate($perPage);
return view('admin.products.index', compact('products'));
}
Ошибка в основном означает, что
$item->categoryравно нулю, И вы не можете получитьnameна нуле. Вы можете сделать что-то вродеempty($item->category) ? null : $item->category->name