微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Laravel 关系:试图获取非对象的属性“描述”

如何解决Laravel 关系:试图获取非对象的属性“描述”

我从昨天开始就面临这个问题。 我有一个名为 resources数据库表有一个外键链接到另一个名为 category 的表。

Screenshot of database tables

我正在尝试检索刀片视图中的 description 字段,但出现此错误

试图获取非对象的属性“描述”。

我的刀片视图:

@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>
@endsection

我的资源模型:

namespace App\Models;

use App\Models\Category;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Resource extends Model
{
    use HasFactory;

    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $fillable = [
        'name','description','category','inventoryN','status','centerId',];

    /**
     * The attributes that should be hidden for arrays.
     *
     * @var array
     */
    protected $hidden = [
    ];

    /**
     * The attributes that should be cast to native types.
     *
     * @var array
     */
    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';

    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $fillable = [
        'description',];

    /**
    * The attributes that should be hidden for arrays.
    *
    * @var array
    */
    protected $hidden = [
    ];

    /**
    * The attributes that should be cast to native types.
    *
    * @var array
    */
    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”的一个dd: dd of $resources

解决方法

您查看的类别有错别字。我认为这就是问题所在。

{{ $resource->categor->description }}

vs. 

{{ $resource->category->description }}
,

使用

@if(!empty($resource->category))
 {{ $resource->category->description }}
@else
 <p>none</p>
@endif
,

这里有几个错误。

第一个是在 Blade 中。你需要修正一个错字

$resource->categor->description
// should be
$resource->category->description

然后我建议通过将资源列从 category 更改为 category_id 来更改架构。
这将有助于 Laravel 自动填充以下代码段中的值。

接下来,您需要修复人际关系。

在资源模型中,您需要

public function category()
{
    return $this->hasOne(Category::class);
}

我删除了第二个和第三个参数,这些是由 Laravel 自动填充的;而且由于您使用的是 Laravel 的命名方案,因此您不需要它。
您之前说过该表是 category 的单数变体,但事实并非如此。

然后你需要将你的 Category 模型改为

public function resource()
{
    return $this->belongsTo(Resource::class);
}

失败的原因是 Laravel 返回了 null,因为列名不太正确。


在您的数据库中拥有更标准的命名结构会更容易,因为它可以帮助其他开发人员,并使您在使用 Laravel 时更轻松。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。