Laravel 关系:试图获得 属性 'description' 的 non-object
Laravel Relationship: Trying to get property 'description' of non-object
从昨天开始我就遇到了这个问题。
我有一个名为 resources
的数据库 table 有一个外键链接到另一个名为 category
.
的 table
我试图在我的 blade 视图中检索 description
字段,但我收到此错误:
Trying to get property 'description' of non-object.
我的 blade 观点:
@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 of $resources
您的类别查看有误。我认为这就是问题所在。
{{ $resource->categor->description }}
vs.
{{ $resource->category->description }}
你这里有一些错误。
第一个是刀锋。您需要更正错别字
$resource->categor->description
// should be
$resource->category->description
然后我建议通过将资源列从 category
更改为 category_id
来更改架构。
这将有助于 Laravel 自动填充以下代码段中的值。
接下来,你需要修复你的人际关系。
在资源模型中,您需要
public function category()
{
return $this->hasOne(Category::class);
}
我删除了第二个和第三个参数,这些参数由 Laravel 自动填充;由于您使用的是 Laravel 的命名方案,因此不需要它。
您之前所说的 table 是类别的单数变体,但事实并非如此。
那么您需要将类别模型更改为
public function resource()
{
return $this->belongsTo(Resource::class);
}
失败的原因是 Laravel 返回了 null
,因为列名不太正确。
在您的数据库中使用更标准的命名结构会更容易,因为它可以帮助其他开发人员,并让您在使用 Laravel 时更轻松。
从昨天开始我就遇到了这个问题。
我有一个名为 resources
的数据库 table 有一个外键链接到另一个名为 category
.
我试图在我的 blade 视图中检索 description
字段,但我收到此错误:
Trying to get property 'description' of non-object.
我的 blade 观点:
@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 of $resources
您的类别查看有误。我认为这就是问题所在。
{{ $resource->categor->description }}
vs.
{{ $resource->category->description }}
你这里有一些错误。
第一个是刀锋。您需要更正错别字
$resource->categor->description
// should be
$resource->category->description
然后我建议通过将资源列从 category
更改为 category_id
来更改架构。
这将有助于 Laravel 自动填充以下代码段中的值。
接下来,你需要修复你的人际关系。
在资源模型中,您需要
public function category()
{
return $this->hasOne(Category::class);
}
我删除了第二个和第三个参数,这些参数由 Laravel 自动填充;由于您使用的是 Laravel 的命名方案,因此不需要它。
您之前所说的 table 是类别的单数变体,但事实并非如此。
那么您需要将类别模型更改为
public function resource()
{
return $this->belongsTo(Resource::class);
}
失败的原因是 Laravel 返回了 null
,因为列名不太正确。
在您的数据库中使用更标准的命名结构会更容易,因为它可以帮助其他开发人员,并让您在使用 Laravel 时更轻松。