【问题标题】:Trying to get property 'name' of non-object. Model relationship not working试图获取非对象的属性“名称”。模型关系不起作用
【发布时间】: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-&gt;hradmin-&gt;name$hradmin-&gt;hradmin 正在返回null。而且您无法访问null 的属性,因为null 没有属性。
  • 一开始我以为是这样,但我的表中没有任何空字段
  • non-nullable 数据库表中的列仍然不能确保 $hradmin-&gt;hradmin 不会是 null。如果没有关联数据,即table_a.idtable_b.foreign_id 不匹配,则仍然可以返回nullbelongsTo() 可以是 null,具体取决于您访问的父记录;永远不要假设某事存在;总是检查它。
  • 谢谢,这很有帮助,但我仍然无法完全诊断正在发生的事情。当我使用可选帮助程序 ( {{optional($hradmin->hradmin)->name }} ) 时,我不再收到错误消息。但是,我屏幕上的输出现在有正确的行数(对应于 HR Admins 的数量),但这些行是空白的,不显示数据。
  • 我的意思是,你定义它的方式是one-to-many,因为你有一个直接查询pivot 表的模型。我不明白为什么这是必要的,当你可以使用 Laravel 的既定逻辑通过belongsToMany() 链接PlanSubmissionHRAdmin,但是是的。通常,您没有pivot 表的模型,因为您不应该直接操作它。 belongsToMany()attach()detach()sync() 方法为您处理。

标签: laravel eloquent laravel-blade laravel-6


【解决方案1】:

对于某些记录,您可能没有 hradmin 关系的任何记录,因此您可以尝试像这样添加 optional helper

<td> {{optional($hradmin->hradmin)->name }}</td>
<td> {{optional($hradmin->hradmin)->email }}</td>

例如为了避免错误

【讨论】:

    猜你喜欢
    • 2020-09-28
    • 1970-01-01
    • 2021-09-03
    • 2019-05-23
    • 2019-07-11
    • 2019-12-13
    • 1970-01-01
    • 2021-06-04
    • 2020-01-23
    相关资源
    最近更新 更多