Web

Отношения Laravel: попытка получить "описание" свойства не-объекта

Я столкнулся со следующей проблемой . У меня есть таблица db с именем, resources у которой есть внешний ключ, связанный с другой таблицей category.

Отношения Laravel: попытка получить "описание" свойства не-объекта

Я пытаюсь получить поле описания в представлении блейда, но получаю эту ошибку:

Попытка получить «описание» свойства не-объекта.

 

Мое представление блейда:

@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

Облачные решения: как работает облачный сервис и зачем он нужен?

Web

Как выполнить многократную вставку в базу данных с помощью запроса foreach insert в mysql

Как обойти блокировку интернета на работе и зайти на нужные сайты?
Web

Как обойти блокировку интернета на работе и зайти на нужные сайты?

Как и на чём лучше писать сайты?
Web

Как и на чём лучше писать сайты?