问题描述
我从昨天开始就面临这个问题。
我有一个名为 resources
的数据库表有一个外键链接到另一个名为 category
的表。
我正在尝试检索刀片视图中的 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 时更轻松。