【发布时间】:2020-04-21 11:12:27
【问题描述】:
我收到与我的模型关系相关的错误消息,并且我的其他应用程序的一个相同部分可以正常工作。我已经多次查看所有内容,但看不出我的模型关系不应该起作用的任何原因。当我尝试访问视图中的模型关系时,我得到“尝试获取非对象的属性'名称'”
我的控制器中有以下内容:
public function edit($id)
{
//
$plansubmission = PlanSubmission::find($id);
$hradmins = PSPlanToHRAdminMapping::where('plan_submission_plan_id', $id)->get();
return view('planbuilder.add-hr-administrators', compact('plansubmission', 'hradmins'));
我的视图中有以下内容:
<h3 class="py-3">Current HR Administrators with Online Access</h3>
<table class="table">
<thead>
<tr>
<th scope="col">Name</th>
<th scope="col">Email Address</th>
</tr>
</thead>
<tbody>
@foreach($hradmins as $hradmin)
<tr>
<td> {{$hradmin->hradmin->name }}</td>
<td> {{$hradmin->hradmin->email }}</td>
@endforeach
</tr>
</tbody>
</table>
我的模型中有以下内容:
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class PSPlanToHRAdminMapping extends Model
{
//
protected $guarded = [];
public function hradmin()
{
return $this->belongsTo('App\HRAdmin');
}
}
我有以下迁移:
{
Schema::create('p_s_plan_to_h_r_admin_mappings', function (Blueprint $table) {
$table->unsignedBigInteger('plan_submission_plan_id');
$table->unsignedBigInteger('h_r_admin_id');
$table->timestamps();
$table->foreign('plan_submission_plan_id')->references('id')->on('plan_submissions');
$table->foreign('h_r_admin_id')->references('id')->on('h_r_admins');
});
}
【问题讨论】:
-
在这条线上:
$hradmin->hradmin->name,$hradmin->hradmin正在返回null。而且您无法访问null的属性,因为null没有属性。 -
一开始我以为是这样,但我的表中没有任何空字段
-
non-nullable数据库表中的列仍然不能确保$hradmin->hradmin不会是null。如果没有关联数据,即table_a.id与table_b.foreign_id不匹配,则仍然可以返回null。belongsTo()可以是null,具体取决于您访问的父记录;永远不要假设某事存在;总是检查它。 -
谢谢,这很有帮助,但我仍然无法完全诊断正在发生的事情。当我使用可选帮助程序 ( {{optional($hradmin->hradmin)->name }} ) 时,我不再收到错误消息。但是,我屏幕上的输出现在有正确的行数(对应于 HR Admins 的数量),但这些行是空白的,不显示数据。
-
我的意思是,你定义它的方式是
one-to-many,因为你有一个直接查询pivot表的模型。我不明白为什么这是必要的,当你可以使用 Laravel 的既定逻辑通过belongsToMany()链接PlanSubmission和HRAdmin,但是是的。通常,您没有pivot表的模型,因为您不应该直接操作它。belongsToMany()的attach()、detach()和sync()方法为您处理。
标签: laravel eloquent laravel-blade laravel-6