Laravel - 此集合实例上不存在属性 [fileieres]
Posted
技术标签:
【中文标题】Laravel - 此集合实例上不存在属性 [fileieres]【英文标题】:Laravel - Property [filieres] does not exist on this collection instance 【发布时间】:2021-09-07 12:41:27 【问题描述】:我的学校应用程序有一个小程序。我想展示一所学校的所有院系。事实上,在我的数据库中,一所学校可以有一个或多个学院,一个学院可以属于一个或多个学校。
模范学校:
public function filieres ()
return $this->belongsToMany('App\Models\Filiere','etablissement_filieres','id_etablissements','id_filieres');
public function etablissement_filieres()
return $this->hasMany('App\Models\Etablissement_filiere');
protected $fillable = [
'nom', 'image', 'ville', 'adresse', 'contact_1', 'contact_2',
'email', 'logo', 'presentation', 'brochure', 'localisation',
];
模型表枢轴Etablissement_filiere
:
public function filiere()
return $this->belongsTo('App\Models\Filiere');
protected $fillable = [
'id', 'id_etablissements', 'id_filieres', 'prise_en_charge', 'prix',
];
模型文件:
public function etablissements ()
return $this->belongsToMany(Etablissement::class,'etablissement_filiere');
protected $fillable = [
'nom', 'diplome_requis', 'diplome_obtenu', 'prix', 'duree', 'type',
];
控制器:
public function show($id)
$faculty = Etablissement_filiere::where('id_etablissements','=','$id')->get();
return view('etablissements/edhec/touteslesfilieresedhec', compact('faculty','etablissements'));
刀片视图:
@foreach($faculty->filieres as $filiere)
<div class="container bg-fil py-4 my-5">
<div class="row pl-5">
<div class="col-md-9">
<h6 class="font-weight-bold"> $filiere ->nom <br>
<span class="text-primary"> $filiere ->diplome_obtenu</span></h6>
</div>
<div class="col-md-3 pt-n5">
<img src="asset($etablissement->image)" >
</div>
</div>
<div class="row pl-5 mt-md-n5">
<div class="col-md-6">
<h6> <strong> Diplôme réquis</strong>: $filiere ->diplome_requis <br>
<strong>Durée</strong>: $filiere ->duree <br>
<strong>Montant de la formation</strong>: $etablissement_filieres ->prix</h6>
</div>
<div class="col-md-6">
<h6> <strong> Mode d'etude</strong>: $filiere ->type <br>
<strong>Prise en charge</strong>: $etablissement_filieres ->prise_en_charge</h6>
</div>
</div>
<div class="row pl-5 mt-4">
<div class="col-md-6">
<a href=" route('inscription') " class="btn btn-success font-weight-bold w-75 now">INSCRIVEZ VOUS MAINTENANT</a>
</div>
</div>
</div>
@endforeach
我正在尝试显示学校的所有院系,但出现此错误:
此集合实例上不存在属性 [fileieres]。
你能告诉我错误是在哪里阻止的吗?
【问题讨论】:
这能回答你的问题吗? Property [title] does not exist on this collection instance 【参考方案1】:当它试图评估 $faculty->filieres
时,您的即时视图错误。
对Model::where()->get()
之类的调用返回模型的集合实例(类似于可迭代组),而不是单个模型。即使该集合仅包含一个模型,它仍然是一个组,而不是模型本身。
所以,$faculty = Etablissement_filiere::where('id_etablissements','=','$id')->get();
返回一个集合,而不是单个模型。单个模型可能有 filieres
属性,但 Collection 实例(它本身是 Laravel 中的一个类)没有。因此,如果您想要的只是第一个结果而不是集合,请以 ->first()
而不是 ->get()
结束该行。
但是,即使您解决了这个问题,您也会遇到第二个问题。您将获得枢轴模型Etablissement_filiere
的实例,然后尝试访问其上的filieres
属性(它没有)。相反,您应该得到一个 School 模型的实例。如果你正确地定义了你的关系,Laravel 会帮你找到枢纽,所以你通常不会直接访问枢纽模型,除非你有特殊的理由。因此,请在您的控制器中尝试此操作:
public function show($id)
$establissement = Etablissement::find($id);
$faculty = $establissement->filieres;
return view('etablissements/edhec/touteslesfilieresedhec', compact('faculty','etablissement'));
然后在你看来:
@foreach($faculty as $filiere)
有更简洁的方法可以做到这一点(例如,查看一些关于路由模型绑定的教程),但这至少应该解决您当前代码的错误。
【讨论】:
好的,我按照你的建议修改了我的控制器,它可以工作了。但它不显示培训的价格和对数据透视表etablissement-filieres
中每个教师的支持。我试图通过在我的控制器中执行此操作来解决问题:$school = Etablissement_filiere::findOrFail($id);
和我的视图刀片: $school->prix
和 $school->prise_en_charge
。但它对学校所有其他学院的第一名教师显示相同的价格和相同的支持。这是做什么的?
首先,在您的 School 模型中,您指定要在检索教师时也检索数据透视列,即 return $this->belongsToMany('App\Models\Filiere','etablissement_filieres','id_etablissements','id_filieres')->withPivot('prise_en_charge', 'prix');
。然后,要检索存储在数据透视表中的数据,如果您按照我在回答中提到的那样加载了教师,在您看来,您只需执行$faculty->pivot->prix
。 (请参阅文档laravel.com/docs/7.x/eloquent-relationships#many-to-many 中的“检索中间表列”部分)。
它有效!我只是在遵循建议的同时将$faculty->pivot->prix
更改为$filiere->pivot->prix
。【参考方案2】:
将代码更改为
public function show($id)
$faculty = Etablissement_filiere::where('id_etablissements','=',$id)->first();
return view('etablissements/edhec/touteslesfilieresedhec', compact('faculty','etablissements'));
【讨论】:
以上是关于Laravel - 此集合实例上不存在属性 [fileieres]的主要内容,如果未能解决你的问题,请参考以下文章