Я столкнулся со следующей проблемой . У меня есть таблица db с именем, resources у которой есть внешний ключ, связанный с другой таблицей category.
Я пытаюсь получить поле описания в представлении блейда, но получаю эту ошибку:
Попытка получить «описание» свойства не-объекта.
Мое представление блейда:
@extends('templates.header')
@section('section')
<div class="p-10 grid grid-cols-1 sm:grid-cols-1 md:grid-cols-3 lg:grid-cols-3 xl:grid-cols-3 gap-5">
@foreach($resources as $resource)
<div class="max-w-sm rounded overflow-hidden shadow-lg">
{{-- <img class="w-full" src="#" alt="Mountain"> --}}
<div class="px-6 py-4">
<div class="font-bold text-xl mb-2">
{{ $resource->name }}
</div>
<p class="text-gray-700 text-base">
{{ $resource->description }}
</p>
</div>
<div class="px-6 pt-4 pb-2">
<span class="inline-block bg-gray-200 rounded-full px-3 py-1 text-sm font-semibold text-gray-700 mr-2 mb-2">{{ $resource->categor->description }}</span>
<span class="inline-block bg-gray-200 rounded-full px-3 py-1 text-sm font-semibold text-gray-700 mr-2 mb-2">{{ $resource->status }}</span>
<span class="inline-block bg-gray-200 rounded-full px-3 py-1 text-sm font-semibold text-gray-700 mr-2 mb-2">{{ $resource->centerId }}</span>
<button type="submit" class="inline-flex justify-center py-2 px-4 border border-transparent shadow-sm text-sm font-medium rounded-md text-white bg-indigo-600 hover:bg-indigo-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-indigo-500">
Prenota
</button>
</div>
</div>
@endforeach
</div>
Моя модель ресурсов:
namespace App\Models;
use App\Models\Category;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class Resource extends Model {
use HasFactory;
//Атрибуты, которые могут быть присвоены массово.
protected $fillable = [
'name',
'description',
'category',
'inventoryN',
'status',
'centerId',
];
// Атрибуты, которые должны быть скрыты для массивов.
protected $hidden = [
];
// Атрибуты, которые должны быть приведены к собственным типам.
protected $casts = [
];
public function category() {
return $this->hasOne(Category::class, 'id', 'category');
}
}
Моя модель категории:
namespace App\Models;
use App\Models\Resource;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class Category extends Model {
use HasFactory;
protected $table = 'categories';
// Атрибуты, которые могут быть присвоены массово.
protected $fillable = [
'description',
];
// Атрибуты, которые должны быть скрыты для массивов.
protected $hidden = [
];
// Атрибуты, которые должны быть приведены к собственным типам.
protected $casts = [
];
public function resource() {
return $this->belongsTo(Resource::class, 'category');
}
}
И, наконец, мой ResourceController:
namespace App\Http\Controllers;
use App\Models\Category;
use App\Models\Resource;
use Illuminate\Http\Request;
class ResourceController extends Controller {
public function index() {
$resources = Resource::with('category')->get();
return view('resources', compact('resources'));
}
}
Это дд «$ resources»
Ответ 1
Здесь у вас есть несколько ошибок.
Первый находится в Blade. Вам нужно исправить опечатку
$resource->categor->description
// должно быть
$resource->category->description
Затем я рекомендую изменить вашу схему, изменив столбец ресурсов с category на category_id.
Это поможет Laravel автоматически заполнить значения в приведенных ниже фрагментах.Далее вам нужно наладить отношения.
В модели ресурсов вам нужно
public function category() {
return $this->hasOne(Category::class);
}
Я удалил второй и третий параметры, они автоматически заполняются Laravel; и поскольку вы используете схемы именования Laravel, они вам не нужны.
Ранее вы заявляли, что таблица является единственным вариантом категории, а это не так.Затем вам нужно изменить модель категории на
public function resource() {
return $this->belongsTo(Resource::class);
}
Причина сбоя в том, что возвращается Laravel null, потому что имена столбцов были не совсем правильными.
Проще просто иметь более стандартную структуру имен в вашей базе данных, поскольку это помогает другим разработчикам и облегчает вашу жизнь при использовании Laravel.
Ответ 2
Опечатка при просмотре вашей категории. Думаю, в этом проблема. Поменять на:
{{ $resource->categor->description }}
Поменять на:
{{ $resource->category->description }}
Ответ 3
Лучше использовать так:
@if(!empty($resource->category))
{{ $resource->category->description }}
@else
<p>none</p>
@endif
Web